比较“Hello”和“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;
}