当前位置: 代码迷 >> 综合 >> 切割字符串的方法
  详细解决方案

切割字符串的方法

热度:62   发布时间:2023-09-27 18:01:54.0

关于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());}

 

  相关解决方案