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

从文件读取问题并将用户答案存入结构体数组的问题排查

问题排查与修复方案

先帮你一步步拆解问题,从代码里的明显错误到逻辑漏洞逐一梳理:

1. 结构体定义的语法错误

你给出的结构体里 char a40][250]; 是语法错误,正确写法应该是 char a[40][250];——少了左方括号会直接导致结构体内存布局错乱,根本无法正确访问a数组来存储答案。

2. for循环的初始化逻辑错误

你提到的读取文件的for循环写了for(i>0;i<...,这完全不符合C语言for循环的语法规范,正确的初始化应该是for(i=0; i<[问题总数]; i++)。初始化条件写错会导致循环要么不执行,要么遍历错误的索引范围,直接影响后续的答案存储和打印。

3. 用户答案存储与打印的逻辑补全

假设你已经成功读取了n个问题到q.q数组,接下来需要对应索引将用户答案存入q.a数组,最后通过循环遍历索引来打印每一组问题和答案。

修正后的完整代码示例

#include <stdio.h>
#include <string.h>

// 修正结构体语法
struct qa {
    char q[40][250];  // 存储问题
    char a[40][250];  // 存储用户答案
};

int main() {
    int i, question_count = 0;
    FILE *fp = fopen("quest.txt", "r");
    
    // 必须检查文件是否成功打开
    if (!fp) {
        printf("无法打开问题文件!\n");
        return 1;
    }

    struct qa q;

    // 读取文件中的问题到q.q数组
    while (fgets(q.q[question_count], 250, fp) != NULL && question_count < 40) {
        // 去掉fgets自带的换行符,避免存储冗余内容
        q.q[question_count][strcspn(q.q[question_count], "\n")] = '\0';
        question_count++;
    }
    fclose(fp);

    // 获取用户答案并存入q.a数组
    for (i = 0; i < question_count; i++) {
        printf("问题%d: %s\n请输入答案:", i+1, q.q[i]);
        fgets(q.a[i], 250, stdin);
        // 同样去除换行符
        q.a[i][strcspn(q.a[i], "\n")] = '\0';
    }

    // 打印所有问题与对应的用户答案
    printf("\n--- 你的作答记录 ---\n");
    for (i = 0; i < question_count; i++) {
        printf("问题%d: %s\n你的答案: %s\n\n", i+1, q.q[i], q.a[i]);
    }

    return 0;
}

额外注意事项

  • 用fgets读取内容后,记得用strcspn去掉末尾的换行符,避免存储的内容带多余的换行标记。
  • 一定要检查文件是否成功打开,否则会导致后续操作直接崩溃。
  • 严格控制数组索引范围(比如不超过40),避免数组越界访问引发不可预测的内存错误。

内容的提问来源于stack exchange,提问作者Joepoint

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:07:53