我试图编写一个代码来查找一个单词是否是回文,但它不起作用。怎么了?

I have tried to write a code to find if a word is a palindrome or not but it is not working. Whats's wrong with it?

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    int len;
    char char1[100],char2[100];
    cout << "Enter a word:" << endl;

    cin >> char1;
    len = strlen(char1);

    for(int i=0;i<len;i++)
    {
        char2[i] = char1[len-i-1];
    }
    if(strcmp(char1,char2))
    {
        cout << "It is not a palindrome." << endl;
    }
    else
    {
        cout << "It is a palindrome" << endl;
    }
}

我试着写了一段代码来判断一个词是否是回文。当我输入 "madam" 作为输入时,输出是 "It is a palindrome"。但是当我输入 "dad" 作为输入时,输出是 "It is not a palindrome"。为什么?

因为这里用字符数组来表示字符串,而且strcmp用来比较这些数组, 您需要记住,文本的最后一个值必须是 '[=16=]'(也称为空字符/空终止符)。

所以在循环之后,反向复制字符串,需要添加以下内容;

char2[len] = '[=10=]';

当使用 strcmp 时,条件应该明确显示它正在检查的内容。原因是 strcmp returns 3 结果 (-1, 0 ,1) 并且如果 API 正确使用。 (尽管 C 和 C++ 具有将值隐式转换为布尔值的功能)

同样与直觉相反,当比较的字符串不同-11) 并在 相同时转换为 false (0).

条件应该是,例如:

if (strcmp(char1, char2) == 0)    // checking if strings are equal

if (strcmp(char1, char2) != 0)    // checking if strings are different

在像这里这样的函数结果不明确的情况下,甚至建议创建一个临时(常量)布尔变量以使代码更容易理解。像这样:

const bool is_palindrome = (strcmp(char1, char2) == 0);
if (is_palindrome)
    // ...

这里还有一个建议,如何实现这个算法:

#include <iostream>
#include <string>

int main()
{
    using namespace std;

    cout << "Enter a word:" << endl;

    string input_str;    
    getline(cin, input_str);

    const string reversed_str(input_str.rbegin(), input_str.rend());

    const bool is_palindrome = (input_str == reversed_str);

    if (is_palindrome)
    {
        cout << "It is a palindrome" << endl;
    }
    else
    {
        cout << "It is not a palindrome." << endl;
    }
}