2012-02-24 100 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()

相关问题