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/

10-11 13:44