-4

質問は

回文とは、たとえば、レースカー、目など、両方向で同じように読み取られる文字列です。ユーザーに文字列を入力するように促し、再帰関数を使用して、指定された入力が回文であるかどうかを判断するプログラムを作成します。

私はこれまでこれを行ってきましたが、うまくいきません:

#include<stdio.h>
#include<conio.h>
#include<string.h>// to save string

int isPalindrome(char*str);

int main (void)
{
    int result;
    char str[50];

    printf("\n pls enter string; \n");
    gets(str);
    result = isPalindrome(str);

    if(result ==1) 
    {
        printf("\n input string in a palindrome string ");
    }
    else
    {
        printf(" not a palindrome");
    }

    getch();

    return 1;
}

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

   if(str[0]=str[lenght - 1])
   {
       length-=2;
   }

   return isPalindrome(str + 1)
}


{
     return 0;
}
4

5 に答える 5

7

質問にC++のタグを付けたので、このアプローチは機能します。

#include <string>
#include <algorithm>
#include <iostream>

bool isPalindrome(const std::string& str)
{
    // comparison based on 2 string iterators - a "normal" one
    // and a reversed one
    return std::equal(str.rbegin(), str.rend(), str.begin());
}

int main()
{
    std::cout << isPalindrome("racecar") << std::endl; // prints 1
    std::cout << isPalindrome("truck") << std::endl; // prints 0
}
于 2012-11-30T14:51:21.557 に答える
3

Stephanの回答ではテスト関数が非常に小さいため、ラムダ構文を使用してさらに単純化できます...

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    auto isPalindrome = [](const std::string& str)->bool{return std::equal(str.rbegin(), str.rend(), str.begin());};
    std::cout << isPalindrome("racecar") << std::endl; // prints 1
    std::cout << isPalindrome("truck") << std::endl; // prints 0
}

これはあなたがこのようないくつかのきちんとしたことをすることを可能にするでしょう

#include <string>
#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<std::string> v{"cat", "racecar", "truck", "1991", "eye", "fish"};

    std::cout << "There are " <<
    count_if(v.begin(), v.end(), [](const std::string& str)->bool{return std::equal(str.rbegin(), str.rend(), str.begin());})
    << " palindromes in the list";
}
于 2012-11-30T15:17:11.110 に答える
2

この関数に関するほとんどすべてが壊れています。

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

    if(str[0]=str[lenght - 1])
    {
        length-=2;
    }

    return isPalindrome(str + 1)
}

{
     return 0;
}

非常に不注意なコピー アンド ペーストを行っただけだと思います。基本的に、return 0は関数スコープの一部ではないため、テストが 0 を返すことはありません。したがって、すべての文字列を回文として受け入れます。そして、これは、最初と最後の文字テストもタイプミスして間違っているという事実よりも前です.

最も明白なバグの修正:

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

    if(str[0]==str[length - 1])
    {
        length-=2;

        return isPalindrome(str + 1)
    }

    return 0;
}

少なくともビルド、実行、正しい結果が得られるコードが得られます。しかし、それは C++ ではありません。

于 2012-11-30T14:43:13.300 に答える
0

この行には問題があります:

if(str[0]=str[lenght - 1])

まず、変数はlengthであり、 ではありません lenght
これだけでも、投稿したコードが実際に実行しているコードではないことを示しています。

第 2 に、C では等値比較は==であり、単一の等号 (代入に使用される) ではありません。

于 2012-11-30T14:36:19.353 に答える
0

あなたはタグでC++と言ったので..

#include <iostream>
#include <algorithm>
#include <string>

int main ()
{
    std::string input, tupni;
    std::cout << "Enter string: ";
    std::getline(std::cin, input);

    tupni = input;
    std::reverse(tupni.begin(), tupni.end());

    if(tupni==input){
        std::cout << "Is a palindrome" <<std::endl;
    }else{
        std::cout << "Not a palindrome" <<std::endl;
    }
}

これはreverse、STL のアルゴリズムを使用します。利用可能な既存のアルゴリズムを常に見てください。ほとんどの場合、問題を迅速に解決するのに役立つ何かがあります。

ここの文字列のコピーは少し無駄です。効率を高めるには、Stephan によって提案された逆イテレータ アプローチを使用します。

于 2012-11-30T14:44:52.477 に答える