string removeNonAlphas(string original)
{
for(int i = 0; i < original.size(); ++i){
if(!(original[i] > 64 && original[i] < 91) &&
!(original[i] > 96 && original[i] < 124)){
original[i] = original[i] - original[i];
}
}
return original;
}
//test1.cpp
string test = "abc abc";
cout << removeNonAlphas(test) << endl; // output = "abcabc"
assert(removeNonAlphas(test) == "abcabc"); // assertion failed
//为什么断言失败? removeNonAlphas结果(“ abcabc”)与
// rhs“ abcabc”
最佳答案
original[i] = original[i] - original[i];
这是因为它用
'\0'
代替了字符,但没有将其删除。因此,输出不是"abcabc"
而是"abc\0abc"
。 '\0'
是不可打印的,因此您不会在输出中看到它,但是在与==
比较时会显示它。不要在字符串中替换字符,而是在迭代旧字符串的同时创建一个新字符串:
string removeNonAlphas(string const& original)
{
std::string result;
for(char c : original)
if((c > 64 && c < 91) ||
(c > 96 && c < 124))
result.push_back(c);
return result;
}
注意:首选使用
std::isalpha
而不是硬编码值。关于c++ - 如果两个值相同,为什么断言失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31302372/