我正在尝试使用此函数来剪切字符串,然后返回它,没有空格和全部小写。要做到这一点,我试图找到" "
来查看字符串"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);
}
答案 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()
与合适的谓词一起使用。