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

C语言实现文件逐行读取 两行值数量匹配时对应位置求和

代码问题排查

你写的read函数存在4个核心错误:

  • 返回值类型设计错误:需要返回当前行读取到的有效数值个数(整数),才能后续判断相邻两行长度是否匹配,返回float类型的首元素没有实际作用
  • 首数字读取逻辑错误:你把行首的个数标识读到了number数组的首地址,类型不匹配会直接造成内存污染
  • 循环终止条件完全无效:i != '\n'是拿循环变量和换行符的ASCII码(10)做比较,根本不会在换行位置停止;而且fscanf读取%d/%f时会自动跳过所有空白符(空格、换行、制表符),不需要手动判断换行位置——因为每行第一个数字已经明确给出了该行后续的数值总数,直接按这个数读取即可
  • 没有做数组长度边界限制,容易触发缓冲区溢出
可直接运行的实现代码
#include <stdio.h>
#define MAX_NUM_PER_LINE 128 // 单行最大支持128个数值,可按需调整

// 读取成功返回当前行有效数值个数,返回-1表示文件读取结束/格式错误
int read(FILE *fp, float array[]) {
    int count;
    int ret = fscanf(fp, "%d", &count);
    if (ret != 1) return -1;
    
    for (int i = 0; i < count; i++) {
        if (fscanf(fp, "%f", &array[i]) != 1) return -1;
    }
    return count;
}

// 长度匹配返回求和结果的元素个数,长度不匹配返回-1
int add(float a1[], int len1, float a2[], int len2, float sum[]) {
    if (len1 != len2) return -1;
    for (int i = 0; i < len1; i++) {
        sum[i] = a1[i] + a2[i];
    }
    return len1;
}

// 输出结果,is_error为1时打印错误提示
void output(float sum[], int len, int is_error) {
    if (is_error) {
        printf("Error(Number n1 != Number n2)\n");
        return;
    }
    for (int i = 0; i < len; i++) {
        if (i > 0) printf(" ");
        printf("%g", sum[i]); // %g自动省略浮点数末尾多余的0,匹配题目输出格式
    }
    printf("\n");
}

int main() {
    FILE *fp = fopen("data.txt", "r"); // 替换为你的txt文件路径
    if (!fp) {
        perror("文件打开失败");
        return 1;
    }

    float arr1[MAX_NUM_PER_LINE], arr2[MAX_NUM_PER_LINE], sum[MAX_NUM_PER_LINE];
    int len1, len2, sum_len;
    while (1) {
        len1 = read(fp, arr1);
        if (len1 == -1) break;
        len2 = read(fp, arr2);
        if (len2 == -1) break; // 若文件存在奇数行,可在此处补充异常处理逻辑

        sum_len = add(arr1, len1, arr2, len2, sum);
        if (sum_len == -1) {
            output(NULL, 0, 1);
        } else {
            output(sum, sum_len, 0);
        }
    }

    fclose(fp);
    return 0;
}
关键逻辑说明
  • 不需要逐字符判断换行:输入格式已经通过行首数字明确给出了每行的数值数量,fscanf会自动跳过所有空白分隔符,逐字符判断换行反而会把逻辑复杂化
  • 用%g格式符打印浮点数,可以自动去掉末尾无意义的0,比如不会把6.6打印成6.600000,完全匹配题目要求的输出格式
  • C语言中数组作为函数参数传递时会退化为指针,无法直接获取数组长度,因此通过read函数的返回值传递每行元素个数,是最简洁的实现方式,完全符合题目要求的三个核心函数的功能划分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:15:45