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

C89中如何通过for循环填充结构体数组?

C89下不用malloc填充结构体数组的解决方案

你的代码主要有两个问题导致在C89环境下无法运行:

  1. C89仅允许在变量声明阶段使用{...}结构体初始化语法,不能用这种方式给已声明的结构体变量赋值;
  2. 字符串数组不能直接通过=赋值,必须用字符串复制函数处理。

直接修改后的可运行代码如下:

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:40:13