使用for循环后嵌套条件判断失效,求原因及代码问题排查
问题原因与修复方案
你的代码存在几个致命逻辑错误,导致嵌套的条件判断完全失效,下面逐一说明并修复:
1. 循环变量冲突
外层遍历测试用例的for循环使用了i,内层判断回文的for循环也复用了i。这会直接覆盖外层循环的i值,比如第一次处理单词后,i会被内层循环修改为字符串长度-1,外层循环的i < t条件会直接不成立,后续测试用例根本不会执行。
修复:将内层循环变量改为j,避免变量名冲突。
2. 回文判断逻辑错误
- 内层循环终止条件
i < n(n = strlen(s)-1)会导致重复比较。比如长度为5的字符串,会重复比较0和4、1和3、2和2、3和1、4和0,完全没必要,还会让计数c的数值失真。正确的回文判断只需比较到字符串中间位置,循环条件应为j <= n / 2。 - 你的代码会在字符不相等时继续计数,这会导致错误判定。只要有一对字符不相等,就可以直接判定不是回文,应该立即跳出循环。
3. 计数变量未重置
变量c仅在定义时初始化为0,但每次处理新单词时没有重置。上一个单词的计数结果会被带到下一次判断中,导致条件判断完全错误。
修复:改用布尔变量标记回文(更清晰),或者在每次读取新单词后将c重置为0。
4. 长度与缩写计算错误
- 题目要求单词长度严格大于7时用缩写,而你用了
n >7,但n = strlen(s)-1(即字符串长度为n+1),正确条件应为(n+1) >7。 - 缩写的长度计算错误:示例中长度为12的单词缩写为
m12m,你代码里写的n-1会得到11,正确应该用字符串的实际长度n+1。
修正后的完整代码
#include <stdio.h> #include <string.h> int main() { char s[21]; int t, i, n, j; scanf("%d", &t); for (i = 0; i < t; i++) { scanf("%s", s); n = strlen(s) - 1; int is_palindrome = 1; // 用布尔变量标记是否为回文,逻辑更清晰 // 仅比较到字符串中间位置 for (j = 0; j <= n / 2; j++) { if (s[j] != s[n - j]) { is_palindrome = 0; break; // 发现不相等,直接跳出循环 } } if (is_palindrome) { if ((n + 1) > 7) { printf("%c%d%c\n", s[0], n + 1, s[n]); } else { printf("%s\n", s); } } else { printf("Not Palindrome\n"); } } return 0; }
内容的提问来源于stack exchange,提问作者Abida Zainab
相关产品推荐
相关产品推荐

