我很难弄清楚为什么我的最后一个 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] 删除。
我来说两句