You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中回文判断的If Else语句输出异常,请求排查错误

代码错误排查与修正

你的代码存在三个关键问题,导致输出结果异常:

  • scanf参数类型不匹配:scanf("%s", &a); 中数组名a本身就是指向数组首元素的指针,不需要加&。加&后传递的是整个数组的地址(类型为char (*)[40]),和scanf要求的char*类型不符,可能引发内存访问错误。正确写法是scanf("%s", a);。

  • strrev的副作用误用:strrev函数会直接修改原字符串并返回原字符串的指针。第一次调用strrev(a)后,数组a已经被反转;第二次调用strrev(a)又会把字符串转回来,此时你比较的是两个相同的指针地址(都是a的地址),完全偏离了回文判断的逻辑。

  • 字符串比较方式错误:==用于比较指针的内存地址,不是字符串内容。判断两个字符串是否相等必须用strcmp函数,返回值为0时表示内容完全一致。

修正后的代码

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

int main ()
{
    char a[40];
    char reversed[40]; // 用额外数组存储反转结果,避免修改原字符串
    
    printf("Enter the word - ") ; 
    scanf("%s", a);
    strcpy(reversed, a); // 复制原字符串到新数组
    strrev(reversed); // 反转新数组,不影响原字符串
    printf("Reversed  - %s \n", reversed) ; 

    if(strcmp(a, reversed) == 0){ // 用strcmp比较字符串内容
        printf("Yes");   
    }
    else{
        printf("No");
    }
    
    return 0;
}

如果不想额外开辟数组,也可以手动判断回文:

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

int main ()
{
    char a[40];
    int is_palindrome = 1;
    int len;
    
    printf("Enter the word - ") ; 
    scanf("%s", a);
    len = strlen(a);
    
    // 手动遍历判断回文,避免strrev的副作用
    for(int i = 0; i < len/2; i++){
        if(a[i] != a[len - 1 - i]){
            is_palindrome = 0;
            break;
        }
    }
    
    strrev(a); // 反转后输出(此时判断逻辑已完成)
    printf("Reversed  - %s \n", a) ; 

    printf(is_palindrome ? "Yes" : "No");
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Sahal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:13:16