【问题标题】:C++: Comparing individual elements of a string to their ASCII values? [closed]C++:将字符串的各个元素与其 ASCII 值进行比较? [关闭]
【发布时间】:2015-01-24 20:59:13
【问题描述】:

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

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

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

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

我一生都无法弄清楚原因,因此非常感谢所有帮助。我也知道可能有更好的方法来解决这个问题,但我仍然想了解为什么这不起作用。

【问题讨论】:

  • 怎么可能同时小于 91 和大于 96?
  • ...哎呀。 ||传入...
  • 请不要使用 ASCII 值。请改用字符文字,例如'A'。字符文字使您的代码更易于阅读。否则,有些人可能不得不尝试找到一个 ASCII 图表来读取您的代码(我没有记住 十进制 值)。

标签: c++ arrays string comparison ascii


【解决方案1】:

除非您有特殊原因,否则您希望将字符串放入 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); });

【讨论】:

    【解决方案2】:

    缺少括号和“或”运算符。简单的错误。

    if((aStrn[index] &gt; 64 &amp;&amp; aStrn[index] &lt; 91) || (aStrn[index] &gt; 96 &amp;&amp; aStrn[index] &lt; 123)) 已修复。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-04
        • 2020-04-06
        • 2012-11-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多