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){
couttocut.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);
}