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

如何利用I/O重定向结合scanf读取含空格文本文件中的浮点值?

代码合理性检查:使用scanf与I/O重定向读取文本文件

你的代码存在几个关键问题,无法正确完成读取任务,具体分析及修正建议如下:

原代码问题分析

#include <stdio.h>
#include <math.h>

int main(void){
    int readingsLen = 5040;
    float readings[readingsLen];
    float* readingsPtr = (float*)readings;

    while (scanf("%.2f", readingsPtr) != EOF){
        readingsPtr++;
    }
}
  • 格式字符串错误:scanf的格式字符串不能用"%.2f",这是printf专属的输出精度控制语法。读取浮点数只需用"%f",scanf会自动识别文本中的浮点数值,精度控制对读取逻辑无意义。
  • 数组越界风险:循环未限制读取次数,若文本文件中的浮点数数量超过5040个,指针会越界访问数组外内存,触发未定义行为。
  • 冗余代码:<math.h>头文件未被使用,可直接移除;(float*)强制转换多余,数组名readings可直接隐式转换为float*类型。

修正后的代码

#include <stdio.h>

int main(void){
    const int readingsLen = 5040;
    float readings[readingsLen];
    float* readingsPtr = readings;
    int count = 0;

    // 限制读取数量,避免数组越界
    while (count < readingsLen && scanf("%f", readingsPtr) != EOF){
        readingsPtr++;
        count++;
    }

    // 可选:打印读取结果用于验证
    printf("共读取%d个数值\n", count);
    readingsPtr = readings;
    for(int i = 0; i < count; i++){
        printf("%.2f ", *(readingsPtr + i));
    }
    printf("\n");

    return 0;
}

I/O重定向使用说明

编译代码后,在命令行通过以下方式实现重定向读取:

# 假设编译后程序名为read_data,文本文件为input.txt
./read_data < input.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:01:12