C语言代码break语句失效:首字符为换行时循环无法终止
问题分析与修复方案
你的循环无法终止的核心原因是**scanf("%s")会自动跳过所有空白字符(包括换行、空格、制表符)**,它永远不会把换行符读入words[i][0],自然触发不了break条件。
修复步骤及代码优化
- 用
fgets替代scanf读取整行:fgets会保留输入中的换行符,能直接检测到用户输入空行(行首为换行)的情况。 - 初始化未赋值的变量:
letternumber数组未初始化时会是随机垃圾值,必须先设为0。 - 修正未定义变量:最后打印循环里的
n未声明,改用记录实际读取行数的i。 - 修复字符串反转逻辑:原代码中
lowercase[m-j]会导致数组越界,调整索引从字符串末尾开始取值。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char words[1000][100], lowercase[100]; int i, j, l, s, letternumber[100] = {0}; // 初始化数组为0 for (i = 0; i < 1000; i++) { // 读取整行输入,包含换行符 if (fgets(words[i], sizeof(words[i]), stdin) == NULL) { break; // 读取失败或到文件尾时终止 } // 检测空行(直接按回车) if (words[i][0] == '\n') { break; } // 去掉fgets读取的末尾换行符 words[i][strcspn(words[i], "\n")] = '\0'; // 直接用strlen获取字符串长度 letternumber[i] = strlen(words[i]); } // 修复字符串反转逻辑 for (s = 0; s < i; s++) { strcpy(lowercase, words[s]); for (j = 0; j < letternumber[s]; j++) { words[s][j] = lowercase[letternumber[s] - 1 - j]; } } // 打印反转后的内容 for (l = 0; l < i; l++) { printf("%s\n", words[l]); } return 0; }
关键修改说明
fgets的使用:保留输入中的换行符,让空行检测逻辑生效,同时避免scanf跳过空白的问题。- 数组初始化:
letternumber[100] = {0}确保初始长度为0,避免随机值引发的错误。 - 字符串处理简化:用
strlen和strcpy替代手动循环,代码更简洁可靠。 - 索引修正:反转时从
letternumber[s]-1-j取值,彻底避免数组越界问题。
内容的提问来源于stack exchange,提问作者Karol123H
相关产品推荐
相关产品推荐

