You need to enable JavaScript to run this app. C语言数组重复字符检查:嵌套循环为何误判不同字符相等?
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组重复字符检查:嵌套循环为何误判不同字符相等?

重复字符检测代码异常问题排查

核心问题拆解

  • 数组越界访问导致比对野值:内层循环i的取值范围是0到strlen(argv[1]) - 1,当i取到最大值时,i + 1恰好等于字符串长度,此时访问argv[1][i + 1]已经超出了字符数组的合法下标范围(合法下标为0到长度-1),读取到的是栈内存中的随机垃圾值,并非你输入的字符串内容。
  • 打印变量与实际比对变量不一致:触发错误分支后,代码打印的是argv[1][n]和argv[1][i],但实际执行相等判断的是argv[1][n]和argv[1][i + 1]。你看到的打印值根本不是触发相等判断的两个字符,这就是你误以为“A和K这类明显不相等的字符被判相等”的直接原因。
  • 比对逻辑完全偏离设计目标:你原本的需求是“外层循环取当前位置字符,和它后方的所有字符逐一比对”,但当前代码的内层循环从0开始遍历全字符串,还会出现i + 1 == n的情况,也就是当前字符和自身比对,该判断恒成立,会无意义触发错误分支。
  • 冗余的strlen重复调用:循环条件中反复调用strlen(argv[1]),每次调用都会重新遍历整个字符串计算长度,属于不必要的性能消耗。

修正后的参考实现

// 提前计算字符串长度,避免重复调用strlen
int len = strlen(argv[1]);
// 外层遍历到倒数第二个字符即可,最后一个字符后方没有可比对内容
for (int n = 0; n < len - 1; n++)
{
    // 内层从当前字符的下一个位置开始遍历,无需从头开始
    for (int i = n + 1; i < len; i++)
    {
        if (argv[1][n] == argv[1][i])
        {
            printf("发现重复字符:%c(位置%d、%d)\n", argv[1][n], n, i);
            printf("Error.\n");
            return 0;
        }
    }
}

注意:如果你的输入是命令行参数,需要额外判断argc < 2的情况,避免直接访问argv[1]出现空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 15:06:02