C语言用指针数组实现文件读写时printf失效、输出文件为空问题
问题原因
- 核心错误:
char *name[5]定义的是长度为5的字符指针数组,所有指针未初始化分配内存,直接通过fscanf()向野指针指向的地址写入数据属于未定义行为,会触发程序崩溃、输出异常、写入内容为空等随机问题。 - 语法错误:
fscanf()读取字符串时传入&name[i]参数错误,name[i]本身就是指针类型,无需额外取址。 - 容错缺失:未对
fopen()的返回值做非空判断,若data.txt不存在、路径错误或无读取权限,后续所有读写操作都会失效。
修改方案
将字符指针数组替换为固定长度的二维字符数组,自动分配栈内存存储字符串,修正fscanf()传参逻辑,新增文件打开成功校验。
修改后的完整代码如下:
#include<stdio.h> #include<math.h> int main() { FILE *fr, *fw; fr = fopen("data.txt", "r"); // 新增文件打开失败判断 if(fr == NULL) { printf("data.txt打开失败,请检查文件路径和权限"); return 1; } float wt[10], ht[10], bmi[10]; // 修改为二维字符数组,每个名字最多存储19个字符 char name[5][20]; for(int i = 0; i < 5; i++) { // 修正字符串传参,无需取址 fscanf(fr, "%s %f %f", name[i], &wt[i], &ht[i]); bmi[i] = wt[i] / pow(ht[i], 2); } printf("%s", name[2]); fw = fopen("bmi.txt", "w"); if(fw == NULL) { printf("bmi.txt创建失败,请检查写入权限"); fclose(fr); return 1; } for(int j = 0; j < 5; j++) { fprintf(fw, "%s %f\n", name[j], bmi[j]); } fclose(fr); fclose(fw); return 0; }
内容的提问来源于stack exchange,提问作者muntasin_22
相关产品推荐
相关产品推荐

