【问题标题】:C++ palindrome functionC++ 回文函数
【发布时间】:2017-02-10 21:05:44
【问题描述】:
 #include <iostream>
 #include <string>


using namespace std;


bool isPalindrome(string str){



    for(int i = 0; i <= str.length()-1; i++){
        if(str[i] != str[str.length()-1-i]){
            return false;
        }else {
            return true;
        }
    }
}

main(){

    string text;

    do{
        cout << "Enter some Text: " << endl;
        cin >> text;
        if(isPalindrome(text)){
            cout << "The text is a palindrome" << endl;
        }
        else{
            cout << "The text is not a palindrome" << endl;
        }

    }while(text != "Q");

    return 0;
}

有人可以向我解释我的代码有什么问题吗? 如果我输入“otto”作为文本,代码会产生正确的答案。 如果将“ottopo”作为文本输入,代码也可以正常工作,但如果我输入“ottopo”,我会得到“ottopo”是回文的输出,但显然不是。

我似乎遗漏了一些东西,或者可能忽略了一些东西。我知道我可以为此使用 c++ 标准库函数,但我真的很想知道为什么它没有按照我想要的方式工作。

我已经在 java、python、javascript、ruby 等中实现了回文函数......我只是在这个 c++ 代码中找不到我的错误!我知道这很简单,但是太令人沮丧了!

【问题讨论】:

  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • return 从函数返回。
  • 一方面,return 从您的函数返回。这意味着您的循环仅运行第一次迭代,return 语句导致它在该迭代期间返回,并且它永远不会比第一个/最后一个字符比较更进一步。

标签: c++ function palindrome


【解决方案1】:

您在循环的第一次迭代中返回 true。而且你只需要迭代一半的字符串。

更正:

    size_t len = str.length();

    for(int i = 0; i < len/2; i++){
        if(str[i] != str[len-1-i]){
            return false;
        }
    }
    return true;

【讨论】:

    【解决方案2】:

    您不必在 else 语句之后有 return true。将它放在 for 循环之外,您的代码应该可以工作。

    作为一个额外的挑剔,你不必检查直到 strlen(s) - 1,但 strlen(s) / 2 实际上就足够了。我将把它留给你解决,因为它非常简单,与你正在做的事情并没有太大的不同。

    【讨论】:

      【解决方案3】:

      如前所述,return true; 不应该在else 中,而是在for 循环结束之后。这也可以在几行中完成。如果字符串与正常情况相同,则字符串是回文。你只需要

      reversedText = reverse(text.begin(), text.end());
      if (text == reversedText)
          //indicate that it is a palindrome
      else
          //indicate that it is not a palindrome`
      

      一定要包含算法。如果您出于某种原因不想使用库,我可以理解,但我只是想确保您知道这可以很容易地完成。

      【讨论】:

      • 感谢您的回答!我知道使用库函数可以很容易地做到这一点,但有时用“硬”的方式来做是个好习惯!
      • @BamBam281189 我明白这一点。我做过很多次类似的事情。我相信它可以帮助我更好地了解这门语言。
      【解决方案4】:

      如果不是回文,你应该设置一个标志为1,然后在之后中断:

      for (int i = 0; i < len/2; i++) {
          if (str[i] != str[len-1-i]) {
              // here .......
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-01
        • 2015-10-31
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多