2014-04-07 157 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。