fgets 正在影响输出

亚历山德罗·弗洛里斯

我很难弄清楚为什么我的最后一个 fgets() 似乎将值删除到“studente[0].nome”中,同时当我使用没有发生的 scanf() 时,所以我会喜欢如果有人可以向我解释问题并给我一个新的学习机会。提前致谢。

struct studenti
{
    char nome[40];
    char cognome[40];
    short voto;
    char matricola[3];
};

#define N_STUDENTI 1

int main(void)
{
struct studenti studente[N_STUDENTI];
//float media = 0.0f;
char matricola[3];

printf("Inserisci i dati degli studenti nel Db:\n");

for(short i = 0;i<N_STUDENTI;i++)
{
    printf("Studente %d\n", i+1);
    fputs("NOME:", stdout);
    fgets(studente[i].nome, 40, stdin);
    fputs("COGNOME:", stdout);
    fgets(studente[i].cognome, 40, stdin);
    fputs("NUMERO MATRICOLA:", stdout);
    fgets(studente[i].matricola, 4, stdin);
    fputs("VOTO:", stdout);
    scanf("%hu", &studente[i].voto);
    getchar();
}

/* */
puts("INSERISCI MATRICOLA DELLO STUDENTE: ");
fgets(matricola, 4, stdin);//**HERE IS THE PROBLEM**
//whith a getcahr() works
printf("\n*NOME*: %s*", studente[0].nome);

return 0;
}
某程序员哥们

你做

fgets(studente[i].matricola, 4, stdin);

matricola定义是

char matricola[3];

这意味着您可以超出数组范围并具有未定义的行为

fgets与数组(不是指针)一起使用时sizeof总是使用来获取大小:

fgets(studente[i].matricola, sizeof studente[i].matricola, stdin);

这样,您将始终传递正确的大小。

当然,当您读入独立数组时,在循环之后您会遇到同样的问题matricola

如果您确实需要一个三字符的字符串,那么您需要将大小增加到4(以适应空终止符)。如果你需要一个字符的字符串,那么大小应该是5.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章