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
相关产品推荐
相关产品推荐

