切割字符串的方法

关于C++中string::npos

发现这个问题是在这段代码中:

                                            size_t pos=urls.find_first_of('/',7);
                                            if(pos!=string::npos)
                                                   len=pos-7;
                                           else
                                                  len=urls.length()-7;

首先是find_first_of,int find_first_of(char c, int start = 0),这个函数是从字符串的start位开始寻找字符为c的第一个位置,找到返回该位置,否则返回-1;

关键是这个为什么要跟string::npos进行比较呢?

npos的原型应该是std::container_type::size_type,每一个容器类都会定义这个值,表示一个不存在的位,用于统一对容器查找结果的判断,如find函数,若没有找到相应的值,就会返回npos,大家只要判断find返回的值是不是等于npos,就能判断出,在该容器是不是存在该值,平时我们判断的时候,只是看find返回的值是否等于-1,若为-1则未找到,其实是因为string::pos为-1,故正确,但是放在其他容器就不一定是这样,故大家进行判断的时候最好用npos。

 

关于std::string::substr用法

string substr (size_t pos = 0, size_t len = npos) const;

产生子串

返回一个新建的初始化为string对象的子串的拷贝string对象。

子串是,在字符位置pos开始,跨越len个字符(或直到字符串的结尾,以先到者为准)对象的部分。
 

参数

pos

第一个字符的位置被复制为子串。
如果这是等于字符串的长度,该函数返回一个空字符串。
如果这是大于字符串的长度,它会抛出out_of_range。
注意:第一个字符表示为值0(不是1)。

len

字符数在子包括(如果字符串是短,尽可能多的字符可以在需要使用)。
字符串::非营利值表示的所有字符,直到字符串的结尾。


size_t is an unsigned integral type (the same as member type string::size_type).
 

返回值

string object with a substring of this object. 

Example

// string::substr
#include <iostream>
#include <string>
int main ()
{
std::string str="We think in generalities, but we live in details.";
// (quoting Alfred N. Whitehead)
std::string str2 = str.substr (3,5); // "think"
std::size_t pos = str.find("live"); // position of "live" in str
std::string str3 = str.substr (pos); // get from "live" to the end
std::cout << str2 << ' ' << str3 << '\n';
return 0;
}

Output:

think live in details.

关于字符串切割的函数方法:

void ToolsSplit(std::string& strSrc, char flag, std::vector<std::string>& list)
{
	std::string::size_type index = 0;
	std::string::size_type find_idx = std::string::npos;
	do{
		find_idx = strSrc.find(flag, index);
		if (find_idx != std::string::npos)
		{
			std::string strelem = strSrc.substr(index, find_idx - index);
			list.push_back(strelem);
			index = find_idx + 1;
		}
	} while (find_idx != std::string::npos && index < strSrc.size());
	std::string strelem = strSrc.substr(index, std::string::npos);
	list.push_back(strelem);
}


使用例子:

    string sPos = “2,3,5”;
    vector<string> pts;
    ToolsSplit(sPos, ',', pts);
    if (pts.size() >= 3)
    {
           Vector3d point_pos;
           point_pos.x = atof(pts[0].c_str());
           point_pos.y = atof(pts[1].c_str());
           point_pos.z = atof(pts[2].c_str());

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值