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

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;
}

修复说明

  1. 合并重复的变量声明,避免编译警告和未定义行为。
  2. 用getchar()清除scanf留下的换行符,保证第一个字符串能正常读取。
  3. 每次循环开始时重置length和reverse_string,确保不受上一次循环的数据影响。
  4. 替换gets()为fgets(),同时处理掉fgets读取的换行符,避免字符串末尾残留换行导致长度计算错误。
  5. 回文判断时,一旦发现字符不匹配就跳出循环,提升效率。

测试你的用例:
输入:

3
asdffgg
qq
dfghht

输出会和预期完全一致:

-1
1
-1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:35:19