C++ C++;std::string::find总是返回NPO吗?

C++ C++;std::string::find总是返回NPO吗?,c++,string,find,C++,String,Find,我试图让这个函数切碎一个字符串,然后返回它,不带空格,全部小写。为了做到这一点,我试图找到一个“,看看一个字符串,“时间旅行者”(因为这样说他会很方便),是否包含一个空格 代码如下,将上面的字符串传递给此函数。它总是返回string::npos。你知道这个问题吗 string chopstring(string tocut){ string totoken = ""; int start = 0; while(tocut[0] == ' ' || tocut[0] ==

我试图让这个函数切碎一个字符串,然后返回它,不带空格,全部小写。为了做到这一点,我试图找到一个
,看看一个字符串,
“时间旅行者”(因为这样说他会很方便)
,是否包含一个空格

代码如下,将上面的字符串传递给此函数。它总是返回
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);
}
string-chopstring(string-tocut){
字符串totoken=“”;
int start=0;
而(tocut[0]=''| | tocut[0]==10 | | tocut[0==13]){
tocut.erase(0);
}
int finish=0;
finish=tocut.find(“,start”);
if(finish==string::npos){
cout
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
是按值传递的,然后立即返回。

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
是按值传递的,然后您立即返回。

实际上,大部分代码可以编写得简单得多(假设我认为您想要删除所有空格的理解是正确的):


如果确实要删除所有空格,可能需要使用带有适当谓词的
std::remove_If()

实际上,大部分代码编写起来可能要简单得多(假设我认为您要删除所有空格的理解是正确的):


如果确实要删除所有空白,可能需要使用带有适当谓词的
std::remove_If()

但上面写着迭代器擦除(迭代器位置);擦除迭代器位置引用的字符。只影响一个字符。此外,
tocut[0]==10 | | tocut[0==13]
看起来很奇怪。如果要比较与字符的文字,请使用实际文字(即10而不是“
\n
”),它的可读性要高得多。
tocut[0==13]
可能是一个打字错误,而且由于
0==13
始终为false,您将返回第一个字符的值(如果字符串不是空的,则该值将为非零)。再次使用字符文字(
'\r'
)@Samuraisoulification:
int
string::iterator
@Samuraisoulification的类型不同,但您传递的是int,而不是迭代器,因此此重载
擦除(size\t pos=0,size\t n=npos)
正在被使用。@SamuraIsoulization:另外,您不应该将
size\u t
转换为
int
,这可能会导致未定义的行为。使用
size\u t
,或者更好的是,使用
std::string::size\u type
。但上面写着迭代器擦除(迭代器位置);删除迭代器位置引用的字符。只影响一个字符。此外,
tocut[0]==10 | | tocut[0==13]
看起来非常奇怪。如果要比较与字符文字,请使用实际文字(即10而不是“
\n
”),它的可读性要高得多。
tocut[0==13]
可能是一个输入错误,由于
0==13
始终为false,您将返回第一个字符的值(如果字符串不为空,则该值将为非零)。再次使用字符文字(
'\r'
)@SamuraIsoulization:
int
与@SamuraIsoulization的类型不同,但您传递的是int,而不是迭代器,因此此重载
擦除(size\t pos=0,size\t n=npos)
正在被使用。@SamuraIsoulization:另外,您不应该将
size\u t
转换为
int
,这可能会导致未定义的行为。使用
size\u t
,或者更好的是,使用
std::string::size\u type
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);
}