回文检测程序中strcmp返回值异常问题求助(初学者)
回文检测代码问题排查与修复
嘿,我来帮你解决这个回文检测的问题!你怀疑的输入中的换行符确实是导致strcmp返回非0结果的核心原因,另外代码里还有几处小细节需要调整,咱们一步步来分析:
问题原因分析
- 换行符的干扰:
fgets()函数会把用户输入结束时按下的回车键(\n)也一并读取到字符串里。比如你输入ABBA,实际存在userSentence里的是"ABBA\n"(长度为5)。当你反转这个字符串时,compareSentence会变成"\nABBA",此时用strcmp()比较"ABBA\n"和"\nABBA",由于ASCII码中\n(10)远小于A(65),所以strcmp会返回正数,让你误以为不是回文。 - 打印错误:代码里
printf("\n%d",&cmp);这一行,你打印的是cmp的内存地址,而不是cmp的实际值,这会导致你看到的结果毫无意义,应该去掉取地址符&。 - 缺少结果判断逻辑:原代码没有根据
strcmp的返回值输出最终的检测结果,这也是需要补充的部分。 - 反转后的字符串无结束符:反转时只复制了字符,但没有给
compareSentence添加字符串结束符'\0',后续的strcmp和printf可能会读取到内存垃圾数据。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> void getSentence(char userSentence[]); int breakSentence_andCompare(char userSentence[], char compareSentence[]); #define MAX_SENTENCE 100 int main() { int cmpResult = 0; char userSentence[MAX_SENTENCE] = {0}; char compareSentence[MAX_SENTENCE] = {0}; getSentence(userSentence); cmpResult = breakSentence_andCompare(userSentence, compareSentence); // 补充结果判断与输出 if (cmpResult == 0) { printf("\n这是一个回文!"); } else { printf("\n这不是一个回文!"); } return 0; } /* 获取用户输入的函数 */ void getSentence(char userSentence[]) { printf("Hello And Welcome To The Palindrome Cheker Made By xXTH3 SKIRT CH4S3RXx\n"); printf("Please Enter A Sentence: "); fgets(userSentence, MAX_SENTENCE, stdin); // 移除fgets读取到的换行符 userSentence[strcspn(userSentence, "\n")] = '\0'; } /* 反转字符串并比较的函数 */ int breakSentence_andCompare(char userSentence[], char compareSentence[]) { int i = 0; int z = 0; int len = 0; int cmp = 0; len = strlen(userSentence); // 从最后一个有效字符开始反转 for (i = len - 1; i >= 0; i--) { compareSentence[z] = userSentence[i]; z++; } // 给反转后的字符串添加结束符 compareSentence[z] = '\0'; printf("\nuser: %s | compare: %s", userSentence, compareSentence); cmp = strcmp(userSentence, compareSentence); printf("\nstrcmp返回值:%d", cmp); // 修复打印错误 return cmp; }
关键修复点说明
- 移除换行符:用
strcspn(userSentence, "\n")找到换行符的位置,直接替换为'\0',这样就不会把换行符纳入反转和比较的范围了。 - 修正反转逻辑:
strlen返回的是字符串有效字符的长度(不含'\0'),最后一个有效字符的索引是len-1,直接用这个作为循环起点更清晰。 - 添加字符串结束符:反转后的
compareSentence必须手动加上'\0',避免后续操作读取垃圾数据。 - 补充结果输出:在
main函数里根据strcmp的返回值(0表示相等,即回文)输出最终判断。
内容的提问来源于stack exchange,提问作者SaKaMoToSaN15
相关产品推荐
相关产品推荐

