C++:将字符串的各个元素与其 ASCII 值进行比较?

C++: Comparing individual elements of a string to their ASCII values?

我正在尝试编写一个小程序来确定字符串是否为回文。当然,我想忽略任何不是字母的字符。我计划通过将 ASCII 值与我确定的值进行比较来检查字符串的每个元素来实现此目的:[65,90] U [97,122]

以下代码是函数的一个片段,其中传入了一个字符串 string aStrn

while(aStrn[index] != '[=10=]')
{
    if(aStrn[index] > 64 && aStrn[index] < 91 && aStrn[index] > 96 &&
       aStrn[index] < 123)
    {
        ordered.Push(aStrn[index]);
    }
    index++;
}

我通过显式定义 if(aStrn[index] != ' ' && aStrn[index] != '\''... 等参数来测试此代码,它运行良好。但是,当我尝试上面显示的方法时,ordered 仍然是空的。

我一辈子都弄不明白为什么,所以非常感谢大家的帮助。我也知道可能有更好的方法来解决这个问题,但我仍然想了解为什么这不起作用。

缺少括号和 'OR' 运算符。简单的错误。

if((aStrn[index] > 64 && aStrn[index] < 91) || (aStrn[index] > 96 && aStrn[index] < 123)) 已修复。

除非您有特殊原因,否则您希望将字符串放入 std::string 对象中,使用 std::isalpha 确定某物是否为字母,并且可能 std::copy_if将符合条件的数据从源复制到目标。

std::string source = "This is 1 non-palindromic string!";
std::string dest;

std::copy_if(source.begin(), source.end(),
             std::back_inserter(dest),
             [](unsigned char c) { return std::isalpha(c); });

您可能还希望将字符串完全转换为小写(或大写)以便于比较(假设您希望将大写字母和小写字母同等对待)。这也很简单:

std::transform(dest.begin(), dest.end(), 
               dest.begin(),
               [](unsigned char c) { return std::toupper(c); });

您可以与字符文字进行比较。

if (aStrn[index] >= 'a' && aStrn[index] <= 'z' /* ... */) // for example

但是 standard library 函数可以为您完成这项工作。

if (std::isalpha(aStrn[index])) {
    //...
}