将 "Hello" 与 "olleH" 进行比较时遇到问题

FACING PROBLEM WHILE COMPARING "Hello" with "olleH"

我正在尝试用 c 编写一个程序,它可以识别一个字符串是否等于它的反转。

#include <stdio.h>
#include <string.h>
#include <conio.h>
int main(){
    char str1[10] = "Hello";
    if (str1 == strrev(str1)){
        printf("True");
    }
    else{
        printf("False");
    }
getch();
return 0;
}

据我所知,它应该打印 False,但它打印的是 True。谁能解决这个问题。 谢谢

函数strrev似乎没有创建新的字符数组。它原地反转字符串。所以在这个 if 语句中

if (str1 == strrev(str1)){

比较了指向同一个字符数组第一个元素的两个指针str1

要比较两个字符串,请使用标准 C 函数 strcmp。例如

char str1[10] = "Hello";
char str2[10];

strcpy( str2, str1 );

if ( strcmp( str1, strrev(str2) ) == 0 ){
    printf("True");
}
else{
    printf("False");
}

如果你使用运算符 == 你只是将 str1 内存地址指针与其自身进行比较,当然结果是正确的,尽管 strrev 修改了阵列。 正如前面的答案已经说过的,您应该创建字符数组 str1 的副本,而不是使用 strcmp 来比较两个数组。

我认为值得指出的是,无需创建原始字符串的副本即可检查回文。这将使代码运行得更快并且使用更少的内存。

#include <stdio.h>
#include <string.h>

int is_palindrome(const char *s) {
    int n = strlen(s);
    for (int i=0; i < n--; i++) {
        if (s[i] != s[n]) return 0;
    }
    return 1;
}

int main() {
    char *s1 = "racehorse";
    char *s2 = "racecar";
    printf("'%s' %s a palindrome\n", s1, is_palindrome(s1) ? "is" : "is not");
    printf("'%s' %s a palindrome\n", s2, is_palindrome(s2) ? "is" : "is not");
    return 0;
}