关于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).
返回值
A 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());
}