You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改说明

  1. fgets的使用:保留输入中的换行符,让空行检测逻辑生效,同时避免scanf跳过空白的问题。
  2. 数组初始化:letternumber[100] = {0}确保初始长度为0,避免随机值引发的错误。
  3. 字符串处理简化:用strlen和strcpy替代手动循环,代码更简洁可靠。
  4. 索引修正:反转时从letternumber[s]-1-j取值,彻底避免数组越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:22:42