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

结构体写入文本文件函数调用后程序异常终止问题求助

问题排查与修复方案

嘿,我帮你找出程序调用函数后直接终止的原因了——核心是一个容易踩的文件处理坑,还有几个小的格式错误,我一步步给你拆解:

1. 导致崩溃的直接原因:空指针调用fclose

你把fclose(pok)写在了else代码块的外面!这意味着如果fopen失败(比如文件权限问题、路径错误),pok会是NULL,这时候程序依然会执行fclose(NULL),这属于未定义行为,系统会直接终止程序。

2. 输入输出的格式错误

  • 字符串输入问题:scanf("%s", &artikl.ime)——如果artikl.ime是char数组(比如char ime[50];),完全不需要加&,因为数组名本身就是指向首元素的指针,写成scanf("%s", artikl.ime)就对了;要是ime是单个char,那这个输入逻辑本身就错了,%s是用来读取字符串的。
  • 输出格式错误:fprintf里你用了%c来输出artikl.ime,但%c是输出单个字符的,要输出字符串得用%s,不然不仅输出结果不对,还可能触发内存访问错误。另外你的格式字符串里有多余的逗号(比如\n,),会导致输出文本格式混乱。

3. 修复后的完整代码

我把所有问题都修正了,还给你补了结构体的定义(假设你之前是这么定义的):

#include <stdio.h>

// 先定义结构体,可按需调整数组长度
typedef struct {
    char ime[50];
    float cijena;
    int ID;
} ARTIKL;

void unos_aritkala(void) {
    FILE* pok = NULL;
    pok = fopen("artikli.txt", "a+");

    if (pok == NULL) {
        printf("Datoteka se ne moze otvoriti\n");
        return;  // 打开失败直接返回,避免执行后续逻辑
    }

    ARTIKL artikl;
    printf("Unesite ime artikla: ");
    scanf("%s", artikl.ime);  // 去掉多余的&
    printf("Unesite cijenu artikla: ");
    scanf("%f", &artikl.cijena);
    printf("Unesite ID artikla: ");
    scanf("%d", &artikl.ID);

    // 修正格式字符串,用%s输出字符串,调整排版
    fprintf(pok, "Ime: %s\nCijena: %.2f\nID: %d\n\n", artikl.ime, artikl.cijena, artikl.ID);

    fclose(pok);  // 只有文件打开成功才执行关闭操作
}

// 主函数示例
int main() {
    unos_aritkala();
    return 0;
}

额外小建议

  • 如果需要支持带空格的商品名称,别用scanf("%s"),改用fgets(artikl.ime, sizeof(artikl.ime), stdin),记得手动处理掉输入末尾的换行符。
  • 每次调用scanf后可以检查返回值,比如if (scanf("%f", &artikl.cijena) != 1),这样能避免用户输入非法内容导致程序异常。

内容的提问来源于stack exchange,提问作者J. Markovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:40:10