函数中使用fscanf遇问题:程序崩溃或仅存储首字符
解决C语言文件读取函数崩溃与数组仅存首字符的问题
问题根源:函数参数类型不匹配
你定义的hurricanes和states是二维字符数组(char[NUM_HURRICANES][100]和char[NUM_HURRICANES][5]),但file_handling函数的形参却声明为char *hurricanes和char *states,这直接导致两个问题:
- 最初使用
hurricanes[i]时,编译器会将其解析为单个char类型,而fscanf的%s需要char*类型参数,类型不匹配触发非法内存访问,程序崩溃。 - 改为
&hurricanes[i]后,虽然类型转为char*,但此时指向的是单个字符的地址,fscanf写入时只会把字符串首字符存在该位置,后续字符越界写入,最终表现为数组仅存首字符。
正确的函数参数声明
将函数参数改为与实参匹配的二维数组类型,有两种等效写法:
- 直接声明二维数组(需指定第二维大小,与实参一致):
void file_handling(int *years, char hurricanes[NUM_HURRICANES][100], char states[NUM_HURRICANES][5]) - 使用指向一维数组的指针:
void file_handling(int *years, char (*hurricanes)[100], char (*states)[5])
修正后的完整函数代码
同时补充文件打开失败的退出逻辑,避免空指针操作;添加fscanf返回值检查,及时发现读取错误:
#define NUM_HURRICANES 10 // 根据你的实际定义调整宏值 int years[NUM_HURRICANES] = {0}; char hurricanes[NUM_HURRICANES][100] = {0}, states[NUM_HURRICANES][5] = {0}; void file_handling(int *years, char hurricanes[NUM_HURRICANES][100], char states[NUM_HURRICANES][5]) { FILE *file_ptr = fopen("hurricanes.txt", "r"); if (file_ptr == NULL) { puts("File not found."); return; // 文件打开失败,直接返回避免后续错误操作 } puts("File found."); for(int i = 0; i < NUM_HURRICANES; i++) { // 检查读取是否成功,确保每次读取到3个数据 if (fscanf(file_ptr, "%d %s %s", &years[i], hurricanes[i], states[i]) != 3) { puts("读取数据出错或文件内容不足"); break; } } fclose(file_ptr); }
补充说明
- 二维字符数组的
hurricanes[i]本身就是指向第i个字符串首地址的char*,无需加&,直接传给fscanf的%s即可。 - 检查
fscanf返回值能及时发现文件格式不匹配、内容行数不足等问题,避免后续逻辑基于错误数据执行。
内容的提问来源于stack exchange,提问作者Peter Kirsch
相关产品推荐
相关产品推荐

