2014-04-07 119 views
0

我有一个字符串“我的名字是:贝蒂/ G”。我要提取贝蒂/ 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; 

当我分别打印字符串时,得到以下输出:

:My: 

:name: 

:is:: 

:Betty/G 

没有“:”之后的G字符,这意味着最后一个字符串被损坏或发生了奇怪的事情。

我试图捕获上次串(贝蒂/ 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(贝蒂/ G)。此外,我试图删除空白空间,然后检查长度,它仍然是8.字符串中的最后一个字符后没有空格。

任何人都可以请建议可能是什么问题?

+0

如果你使用'std :: istringstream',它会简单得多。 – timrau

+0

之后是否有换行符,以便冒号在最后一行结束? – nneonneo

+0

您可以在分割之前打印原始字符串,只是为了确保? – Deduplicator

回答

1

该代码在MSVC 2013上运行良好。 您最好使用Boost Tokenizer。