gpt4 book ai didi

c - 段错误 w/fwrite

转载 作者:行者123 更新时间:2023-12-02 03:32:30 27 4
gpt4 key购买 nike

fwrite 函数有问题(我使用 C::B 上的调试检查了它)。这是代码:

struct  studente
{ char Cognome_Nome[30];
char Matricola [11];
short Superati;
float Media_Pesata;
short Crediti;
};
typedef struct studente STUDENTE;

void main()
{ FILE *fp;
STUDENTE Dati;

if((fp = fopen("studente.dat","w+b")) == NULL)
printf("Error\n");
else
{ fflush(stdin);
printf("Inserire il cognome e nome: ");
fgets(Dati.Cognome_Nome, 30, stdin);

fflush(stdin);
printf("\nInserire la matricola: ");
fgets(Dati.Matricola, 11, stdin);

fflush(stdin);
printf("Inserire il numero di esami superati: ");
scanf("%hd", &Dati.Superati);

fflush(stdin);
printf("Inserire la media pesata: ");
scanf("%f", &Dati.Media_Pesata);

fflush(stdin);
printf("Inserire il numero di crediti: ");
scanf("%hd", &Dati.Crediti);

fwrite(&Dati, sizeof(STUDENTE), 1, fp);
}
}

当调用 fwrite 时,我收到一个 Segmentation Fault。我不明白问题出在哪里。我检查了fwrite原型(prototype),我觉得没问题。

提前谢谢你。

最佳答案

您的编译器(例如 VC10 @alk)不理解格式说明符中的 'h',我认为这是 C99 的补充。 3 种解决方案:

  1. 改用新的编译器。

  2. 通过临时变量读取short

    int i;
    scanf("%d", &i);
    Dati.Superati = i;
  3. 将 2 个字段设为 int 而不是 short 并使用 "%d"

    struct  studente {
    ...
    int Superati;
    int Crediti;
    }
    ...
    scanf("%d", &Dati.Superati);
    ...
    scanf("%d", &Dati.Crediti);

其他小建议:

// @ Tom Tanner
// void main()
int main(void)

// Avoid magic numbers
// fgets(Dati.Cognome_Nome, 30, stdin);
fgets(Dati.Cognome_Nome, sizeof Dati.Cognome_Nome, stdin);

// @ Jeyaram
// Do not use fflush(stdin). Better methods exist to handle stray input data
// fflush(stdin);

// Less error prone and easier to maintain code
// fwrite(&Dati, sizeof(STUDENTE), 1, fp);
fwrite(&Dati, sizeof Dati, 1, fp);

// Check I/O function results

关于c - 段错误 w/fwrite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25792416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com