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的存储空间,后续如果用字符串操作函数会出现越界问题。
修复方案
- 简化输入逻辑:直接用
%s读取整行单词,不需要逐字符读取,自动跳过换行符 - 改用计数法判断变位词:遍历两个单词,对每个字符的出现次数做加减校验,时间复杂度更低且逻辑准确
- 调整异常分支逻辑:判断某组不是变位词后仅标记结果,不直接退出程序,继续处理后续组
修复后代码
#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
相关产品推荐
相关产品推荐

