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
相关产品推荐
相关产品推荐

