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

C语言变位词校验代码出现无限输入死循环,该如何调试修复?

问题分析

1. 输入处理逻辑错误,导致输入卡住、输出延迟

你代码中所有scanf里的\n以及单独的scanf("\n")是核心问题:scanf格式串里的空白字符(包括\n、空格、制表符)会匹配输入流中任意数量的连续空白字符,直到遇到第一个非空白字符才会停止匹配。
这就会导致两个现象:

  • 每轮读取完一组的两个单词后,最后执行的scanf("\n")会一直等待输入,直到你输入下一组的整数l才会终止,所以才会出现输入完第二组第一行才打印第一组结果的情况
  • 如果是最后一组数据,读取完两个单词后scanf("\n")会一直等待新的非空白输入,看起来就像无休止请求输入的无限循环

2. 变位词判断逻辑存在缺陷

你当前的逻辑仅校验A字符串的每个字符都在B中出现过,没有处理重复字符的计数问题,比如A = "aab"、B = "abb",每个字符都互相存在,但实际不是变位词。
另外当前逻辑只要发现某一组不是变位词就直接return 0终止程序,不会处理后续剩余的组,不符合多组输入的需求。

3. 字符串存储存在溢出风险

你定义的char A[l], B[l]长度刚好等于单词长度,没有预留字符串结束符\0的存储空间,后续如果用字符串操作函数会出现越界问题。


修复方案

  1. 简化输入逻辑:直接用%s读取整行单词,不需要逐字符读取,自动跳过换行符
  2. 改用计数法判断变位词:遍历两个单词,对每个字符的出现次数做加减校验,时间复杂度更低且逻辑准确
  3. 调整异常分支逻辑:判断某组不是变位词后仅标记结果,不直接退出程序,继续处理后续组

修复后代码

#include <stdio.h>
#include <ctype.h>

int main() {
    int n;
    // 去掉格式串里的\n,避免多余的空白匹配
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        int l;
        scanf("%d", &l);
        // 数组长度+1,预留\0的位置
        char A[l+1], B[l+1];
        scanf("%s", A);
        scanf("%s", B);

        int cnt[256] = {0};
        int is_anagram = 1;
        // 统计A的字符出现次数,不需要区分大小写的话就加上tolower
        for (int j = 0; j < l; j++) {
            cnt[A[j]]++;
        }
        // 减去B的字符出现次数
        for (int j = 0; j < l; j++) {
            cnt[B[j]]--;
        }
        // 校验所有计数是否为0
        for (int j = 0; j < 256; j++) {
            if (cnt[j] != 0) {
                is_anagram = 0;
                break;
            }
        }

        if (is_anagram) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}

测试验证

用你给出的示例输入:

2
6
listen
silent
4
Evil
live

运行后会输出:

YES
NO

完全符合预期,也不会出现输入卡住、输出延迟的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:06:08