C语言回文判断场景下strcmp()函数输出不符合预期问题
问题根因
- C标准要求字符串必须以
\0作为结束标志,strcmp、strlen等字符串处理函数都会持续读取内容直到遇到\0才停止。你的temp数组仅完成了n个字符的反转赋值,没有在末尾手动追加\0,数组末尾之后的内存是未初始化的随机值,导致strcmp比对时实际比对的内容远超过你输入的字符串长度,返回结果不符合预期,打印的时候也会出现乱码。 - 字符数组的长度分配错误:输入长度为n的字符串需要额外1位存储
\0,你声明的ch[n]会导致缓冲区溢出,破坏内存数据。 scanf("%s",&ch);写法错误,数组名本身就是首地址,不需要加取地址符&。
修正代码
#include<stdio.h> #include<string.h> int main() { int n; scanf("%d",&n); // 多留1位存\0 char ch[n+1]; scanf("%s", ch); n = strlen(ch); // 多留1位存\0 char temp[n+1]; int k=0; for(int i = n-1; i >= 0; i--) { temp[k] = ch[i]; k += 1; } // 手动追加字符串结束符 temp[k] = '\0'; int l = strcmp(ch, temp); printf("%d\n",l); if(l == 0) printf("PALINDROME\n"); else printf("NOT PALINDROME\n"); printf("%s", temp); return 0; }
修正效果
现在输入回文字符串nitin时,strcmp会正确返回0,判定为回文,反转字符串打印也不会出现乱码。
内容的提问来源于stack exchange,提问作者Sahil Singh
相关产品推荐
相关产品推荐

