【问题标题】:if statements not working correctly [C++]if 语句无法正常工作 [C++]
【发布时间】:2019-07-23 10:23:00
【问题描述】:

我正在编写代码来检查一个句子是否是回文。我觉得我的逻辑是正确的,但是用于检查字符串反转的 if 语句似乎不起作用。我在网上尝试了很多解决方案,但仍然没有。每个字符串都被视为不是回文。我觉得错误在(句子==反向):

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>

using namespace std;

int main(int argc, char *argv[])  {

while (true) {
  string sentence;
  string reverse = "";

  cout << "Enter a sentence below to check (-1 to end):" << endl;
  getline(cin, sentence);

  if (sentence == "q") {
    break;
  }

  for (int i = sentence.length(); i >= 0; i-- ) {
    reverse += sentence[i];
  }

  cout << sentence << " reversed is: " << "[" << reverse << "]" << endl;

  if (sentence == reverse) {
      cout << sentence << " is a palindrome" << endl;
  } else {
    cout << sentence << " is not a palindrome" << endl;
  }
  cout << endl;
}

}

任何帮助将不胜感激。

【问题讨论】:

  • 你应该使用 String::compare cplusplus.com/reference/string/string/compare
  • 当你打印出句子及其反义词时会打印出什么?此外,您将通过要求 -1 结束但实际测试 q 来彻底混淆您的用户
  • @Dougie compare 用于排序,== 用于相等。

标签: c++ string if-statement operator-keyword


【解决方案1】:

问题不在于if。就是这个部分:

for (int i = sentence.length(); i >= 0; i--) {
        reverse += sentence[i];
}

i = sentence.length() 错了,你必须从i = sentence.length()-1 开始。否则它似乎在字符串中添加了一个空白字符,导致错误的结果。该循环应该是:

for (int i = sentence.length()-1; i >= 0; i--) {
        reverse += sentence[i];
}

注意根据to the documentation:

返回对指定位置 pos 的字符的引用。不 执行边界检查。如果 pos > size(),行为是 未定义。

因此不能保证添加的空格,任何事情都可能发生。要获得更安全的版本,请查看 at 函数,如果位置无效,此函数将抛出异常,而不是静默导致未定义的行为。

【讨论】:

  • 也许初学者应该更喜欢 sentence.at(i) 来替代 sentence[i] 以便执行边界检查。
  • 谢谢!很棒的小解释。现在工作
  • 循环的另一种有效形式是 for (int i = sentence.length(); i &gt; 0; i--) reverse += sentence[i-1]; 对于这种情况,我会采用你的公式,但如果循环索引是无符号的,i &gt;= 0 总是正确的,你最终会得到一个无限的环形。您的工具箱中应该有这两种形式。
【解决方案2】:

字符串的结尾是length - 1,所以改用这个:

for (int i = sentence.length() - 1; i >= 0; --i)

【讨论】:

  • 成功了!非常感谢!
【解决方案3】:

用这个替换你的for循环

for (int i = sentence.length()-1; i >= 0; i-- ) {

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多