C语言fscanf出现格式化错误,对应变量标红该如何解决?
C语言fscanf格式化错误修复方案
核心问题原因
- 数组定义错误:
char* name[1000][10]、char* quantity[1000][10]是未分配内存的二维字符指针数组,无法直接存储读取的内容,且维度逻辑与你循环10次的代码不匹配。如果你需要存储10条数据,单条字符串最大长度99,应该调整为char name[10][100]、char quantity[10][100];如果你的food.txt中数量字段是类似5kg的格式,只需要读取数值部分,可直接将quantity定义为int quantity[10],适配你原代码中的%d%*s格式符。 - 格式符类型不匹配:第一行fscanf使用
%s匹配float类型的costs_2018、costs_2020变量,%s仅用于读取字符串,float类型必须用%f匹配,这是第一行所有参数都报红的核心原因。 - 地址传递错误:数组名本身就是指向首元素的地址,不需要额外加取地址符
&,&name[i]的类型是数组指针,和%s要求的char*类型不匹配,这是两行fscanf中name、quantity都报红的原因。 - 可选优化:fopen后需要判断返回值是否为NULL,避免文件不存在导致程序直接崩溃,读取结束后也需要调用
fclose释放文件资源。
修正后代码示例
#include <stdio.h> // 提前声明自定义函数,避免编译隐式声明报错 float calculate_total_cost(float arr[]); float calculate_total_average(float arr[]); int main() { FILE* fp = fopen("food.txt","r"); // 文件打开失败容错处理 if(fp == NULL) { perror("文件打开失败"); return 1; } float costs_2018[10]; float costs_2020[10]; // 修正数组定义:10条数据,单条字符串最长99字符 char name[10][100]; // 如果只需要读取数量的数值,把下面这句替换为 int quantity[10]; 即可 char quantity[10][100]; // 修正格式符和传参:假设第一行是表头,全部读为字符串 fscanf(fp,"%s %s %s %s", name[0], quantity[0], name[1], name[2]); for (int i=0;i<10;i++) { // 如果quantity是int类型,格式符保持%d%*s,参数改为&quantity[i]即可 fscanf(fp,"%s %s %f %f", name[i], quantity[i], &costs_2018[i], &costs_2020[i]); } printf("total cost in 2018 is = %f\n",calculate_total_cost(costs_2018)); printf("total cost in 2020 is = %f\n",calculate_total_cost(costs_2020)); printf("average cost in 2018 is = %f\n",calculate_total_average(costs_2018)); printf("average cost in 2020 is = %f\n",calculate_total_average(costs_2020)); printf("Difference in total price between 2018 and 2020 is = %f\n",calculate_total_cost(costs_2018)-calculate_total_cost(costs_2020)); printf("Difference in average price between 2018 and 2020 is = %f\n",calculate_total_average(costs_2018)-calculate_total_average(costs_2020)); fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者AB_12
相关产品推荐
相关产品推荐

