C89中如何通过for循环填充结构体数组?
C89下不用malloc填充结构体数组的解决方案
你的代码主要有两个问题导致在C89环境下无法运行:
- C89仅允许在变量声明阶段使用
{...}结构体初始化语法,不能用这种方式给已声明的结构体变量赋值; - 字符串数组不能直接通过
=赋值,必须用字符串复制函数处理。
直接修改后的可运行代码如下:
#include <string.h> #include <stdio.h> // 必须包含,fscanf依赖这个头文件 #define LEN 255 #define MAX_TAB 400 typedef struct { int number; char surname[LEN]; char name[LEN]; } entry; int read_entries(FILE* f, entry table[MAX_TAB]) { int i; // 直接通过结构体成员接收输入,省去中间变量 for (i = 0; i < MAX_TAB; ++i) { // 格式串去掉末尾的\n,%d/%s会自动跳过空白字符(换行、空格等) if (fscanf(f, "%d %s %s", &table[i].number, table[i].surname, table[i].name) != 3) { break; } } return i; }
关键修改说明
- 移除了冗余的中间变量,让
fscanf直接将数据写入数组中对应结构体的成员,既简洁又避免了后续的赋值问题; - 删除了格式字符串里的
\n:%d和%s会自动忽略输入中的空白字符(包括换行、空格、制表符),保留\n反而可能导致程序等待额外输入; - 避开了C89不支持的结构体赋值语法,直接通过成员访问完成数据填充;
- 字符串成员通过
fscanf直接写入,无需额外调用strcpy(如果一定要用中间变量,就需要用strcpy(table[i].surname, surname)来复制字符串内容)。
额外注意
- 编译时要指定C89标准,比如GCC编译时加参数
-std=c89; - 当前
%s格式符会在遇到空格时停止读取,若你的实际数据中姓名包含空格,需要改用%[^\n]等格式并处理缓冲区; - 确保传入的
FILE*是已正确打开的文件指针。
内容的提问来源于stack exchange,提问作者Ter Maxima
相关产品推荐
相关产品推荐

