C++ 使用空格拆分字符串会导致字符串损坏

C++ 使用空格拆分字符串会导致字符串损坏,c++,C++,我有一个字符串“我的名字是:贝蒂/G”。我必须从这个字符串中提取Betty/G,为此我编写了以下代码: std::string str; //"My name is: Betty/G" char sep = ' '; std::vector<std::string> token; for(size_t p=0, q=0; p!=str.npos; p=q) { std::string final = str.substr(p+(p!=0), (q=str.find(sep,

我有一个字符串“我的名字是:贝蒂/G”。我必须从这个字符串中提取Betty/G,为此我编写了以下代码:

std::string str; //"My name is: Betty/G"
char sep = ' ';
std::vector<std::string> token;
for(size_t p=0, q=0; p!=str.npos; p=q)
{
    std::string final = str.substr(p+(p!=0), (q=str.find(sep, p+1))-p-(p!=0));
    token.push_back(final);
}

for(std::vector<std::string>::const_iterator z = token.begin();z!=token.end();++z) 
    std::cout<<":"<<*z<<":"<<std::endl;
G字符后面没有“:”,这意味着最后一个字符串已损坏或发生了奇怪的事情

我试图捕捉最后一个字符串(Betty/G),如下所示:

int count = token.size();
int len,n;
n=count;
char slsName[30];
len = token[--n].size();
strcpy(slsName,token[--count].c_str());
slsName[len]='\0';
printf("length is %d\n",len);
但是它打印的字符串的长度是8,而它应该是7(Betty/G)。此外,我还试图删除空白,然后检查长度,它仍然是8。字符串中最后一个字符后没有空格


任何人都可以提出可能的问题吗?

代码在MSVC 2013上运行良好。
您最好使用Boost标记器。

如果您使用
std::istringstream
,会简单得多。之后是否会有换行符,这样冒号就会出现在下一行?您可以在拆分之前打印原始字符串吗?拆分之前,字符串是“我的名字是:Betty/G”你为什么不做传统的“string::find_first_of”循环,而不是难读且可怕的
str.substr(p+(p!=0),(q=str.find(sep,p+1))-p-(p!=0)
int count = token.size();
int len,n;
n=count;
char slsName[30];
len = token[--n].size();
strcpy(slsName,token[--count].c_str());
slsName[len]='\0';
printf("length is %d\n",len);