C语言无内置函数实现字符串回文:测试用例异常求助
问题分析与修复方案
你的代码存在几个关键问题,导致输出异常:
- 变量重复定义:开头重复声明了
i、length、flag,编译器会发出警告,甚至可能导致变量初始值异常,干扰逻辑判断。 - 输入缓冲区残留换行符:
scanf("%d", &t)读取数字后,输入流里会留下换行符,gets()会直接把这个空行当成第一个字符串,空字符串属于回文,所以本地会先输出1。 length未循环重置:每次处理新字符串前没把length清零,导致后续计算的长度是累加之前的结果,反转和比较逻辑彻底混乱,这就是在线平台结果颠倒的核心原因。gets()不安全:这个函数不检查缓冲区大小,容易触发溢出,建议换用更安全的fgets()。
修正后的代码
#include <stdio.h> #include <string.h> int main(){ char string[25], reverse_string[25] = {'\0'}; int i, length, flag, t; scanf("%d", &t); getchar(); // 清除scanf遗留的换行符 while(t--){ length = 0; // 每次循环重置长度 memset(reverse_string, '\0', sizeof(reverse_string)); // 清空反转字符串 // 用fgets读取字符串,替换不安全的gets fgets(string, sizeof(string), stdin); // 去掉fgets读取到的换行符 string[strcspn(string, "\n")] = '\0'; // 计算字符串长度 for(i = 0; string[i] != '\0'; i++){ length++; } // 手动反转字符串 for(i = length - 1; i >= 0; i--){ reverse_string[length - i - 1] = string[i]; } // 判断回文 flag = 1; for(i = 0; i < length; i++){ if(reverse_string[i] != string[i]){ flag = 0; break; // 发现不匹配直接退出循环,不用继续比较 } } printf("%d\n", flag ? 1 : -1); } return 0; }
修复说明
- 合并重复的变量声明,避免编译警告和未定义行为。
- 用
getchar()清除scanf留下的换行符,保证第一个字符串能正常读取。 - 每次循环开始时重置
length和reverse_string,确保不受上一次循环的数据影响。 - 替换
gets()为fgets(),同时处理掉fgets读取的换行符,避免字符串末尾残留换行导致长度计算错误。 - 回文判断时,一旦发现字符不匹配就跳出循环,提升效率。
测试你的用例:
输入:
3 asdffgg qq dfghht
输出会和预期完全一致:
-1 1 -1
内容的提问来源于stack exchange,提问作者SpaciousCoder78
相关产品推荐
相关产品推荐

