2012-02-24 103 views
0

我試圖讓這個函數切割一個字符串,然後返回它沒有空白和全部小寫。爲了做到這一點,我試圖找到" "以查看字符串"The Time Traveller (for so it will be convenient to speak of him)"是否包含空格。C++ std :: string :: find總是返回npos?

代碼如下,將上面的字符串傳遞給此函數。它總是返回string::npos。有關這個問題的任何想法?

string chopstring(string tocut){ 
    string totoken = ""; 
    int start = 0; 
    while(tocut[0] == ' ' || tocut[0] == 10 || tocut[0 == 13]){ 
     tocut.erase(0); 
    } 
    int finish = 0; 
    finish = tocut.find(" ", start); 
    if (finish == string::npos){ 
     cout << "NPOS!" << endl; 
    } 
    for (int i = start; i < finish; i++){ 
     totoken += tocut[i]; 
    } 
    tocut.erase(start, finish); 
    return tokenize(totoken); 
} 

回答

3

tocut.erase(0)被擦除tocut所有。該參數是第一個要擦除的字符,默認長度是「全部」。

tocut[0 == 13]應該可能是tocut[0] == 13。這些是非常不同的陳述。此外,請與字符值('\t')進行比較,而不是整數。順便說一下,這與以前的結合是您的實際問題:tocut[0 == 13]變爲tocut[false],這是tocut[0],這是true。所以循環運行,直到tocut是空的,這是立即(因爲你在第一個過程中徹底清除它)。

上述兩個錯誤的淨效果是,當您到達find語句時,tocut是空字符串,它不包含空格字符。繼續...

您可以使用substr函數而不是您的循環從tocut遷移到totoken

你最後tocut.erase(start, finish)線沒有做任何有用的,因爲tocut是傳遞的價值和你之後立即返回。

+0

但在http://www.cplusplus.com/reference/string/string/erase/ 它說 迭代器擦除(迭代器位置); 擦除迭代器位置引用的字符。只有一個字符受到影響。 – samuraiseoul 2012-02-24 00:46:35

+1

另外,'tocut [0] == 10 || tocut [0 == 13]'看起來很奇怪。如果你想比較字符文字,使用實際的文字(即10,而不是'\ n''),它更可讀。 'tocut [0 == 13]'大概是一個錯字,並且由於'0 == 13'總是爲false,所以你會返回第一個字符的值(如果字符串不爲空,它將不爲零) 。再次使用字符文字(''\ r'') – 2012-02-24 00:49:27

+1

@Samuraisoulification:'int'與'string :: iterator'不是一樣的類型。 – 2012-02-24 00:50:00

1

事實上,大部分代碼可以寫成更簡單(假設你要刪除所有空格我的理解是正確的):

string chopstring(string tocut) { 
    std::string::size_type first(tocut.find_first_of(" \n\r")); 
    if (first != tocut.npos) { 
     tocut.substr(first); 
    } 
    tocut.erase(std::remove(tocut.begin(), tocut.end(), ' '), tocut.end()); 
    return tokenize(tocut); 
} 

如果你真的想移除所有的空格,你可能想以合適的謂詞使用std::remove_if()

相關問題