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

C语言文本处理程序仅读取单行而非全部输入内容问题排查

代码错误分析
  • 缺少外层逐行读取循环:当前代码仅执行1次读取操作,只能处理第一行内容,没有循环读取文件剩余所有行的逻辑,是仅输出第一行的核心原因。
  • 读取整行的函数使用错误:fscanf(fr, "%s", riadok) 以%s读取时碰到空格、换行符就会终止,无法读取包含空格的完整行,读取整行应使用fgets()函数。
  • 变量未初始化:变量y声明后未赋值就参与判断y < 1000,初始值是内存随机值,会导致行内容处理逻辑完全不可控。
  • 行处理逻辑边界错误:行内容处理的循环条件不应该是y < 1000,应该判断到字符串结束符'\0'就终止,否则会处理数组中未赋值的垃圾内容,甚至触发越界访问。
  • 输出缺少换行保留逻辑:处理完的行写入输出文件时没有保留换行符,会导致所有输出内容挤在同一行。
  • 缺少文件打开成功校验:如果输入/输出文件打开失败,后续读写操作会直接触发程序崩溃。
修复后参考代码
#include <stdio.h>

int cv6_treti()
{
    char riadok[1000];
    // 行号从1开始计数
    int line_num = 1;
    FILE *fr = fopen("input.txt", "r");
    FILE *fw = fopen("output.txt", "w");

    // 文件打开失败校验
    if (fr == NULL || fw == NULL) {
        perror("文件打开失败");
        return -1;
    }

    // 外层循环逐行读取,读到文件末尾fgets返回NULL自动终止
    while (fgets(riadok, sizeof(riadok), fr) != NULL) {
        int y = 0;
        // 遍历当前行每个字符,到结束符停止
        while (riadok[y] != '\0') {
            if (line_num % 2 == 1) {
                // 奇数行替换数字为*
                if (riadok[y] >= '0' && riadok[y] <= '9') {
                    riadok[y] = '*';
                }
            } else {
                // 偶数行替换字母为-
                if ((riadok[y] >= 'a' && riadok[y] <= 'z') || (riadok[y] >= 'A' && riadok[y] <= 'Z')) {
                    riadok[y] = '-';
                }
            }
            y++;
        }
        // 写入处理后的行,fgets会自带换行符无需额外添加
        fprintf(fw, "%s", riadok);
        // 行号递增
        line_num++;
    }

    fclose(fw);
    fclose(fr);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:03