C ++ std :: string :: find总是返回npos?

时间:2012-02-24 00:41:25

标签: c++ string find

我正在尝试使用此函数来剪切字符串,然后返回它,没有空格和全部小写。要做到这一点,我试图找到" "来查看字符串"The Time Traveller (for so it will be convenient to speak of him)"是否包含空格。

代码如下,将上面的字符串传递给此函数。它总是返回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);
}

2 个答案:

答案 0 :(得分: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是按值传递的,之后您会立即返回。

答案 1 :(得分: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()与合适的谓词一起使用。