我很难弄清楚为什么我的最后一个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;
}
答案 0 :(得分:1)
你做
sampleApp.controller('ShowOrdersController', function ($scope, $location) {
$scope.msg = 'This is Show orders screen123';
$scope.moveToOthers = function () {
$location.path('/others_page/100')
}
});
但是fgets(studente[i].matricola, 4, stdin);
的定义是
matricola
这意味着您可以超出数组的范围并拥有undefined behavior。
在将char matricola[3];
与数组(而不是指针)一起使用时,请始终使用fgets
来获取大小:
sizeof
这样,您将始终通过正确的大小。
当然,当您读取独立数组fgets(studente[i].matricola, sizeof studente[i].matricola, stdin);
时,循环后也会遇到相同的问题。
如果确实需要三个字符的字符串,则需要将大小增加到matricola
(以适合空终止符)。如果需要四个字符串,则大小应为4
。
答案 1 :(得分:0)
来自fgets()
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a new-
line. If a newline is read, it is stored into the buffer. A terminating null byte ('\0') is stored after the last character in the buffer.
当您声明此数组时
struct studenti studente[N_STUDENTI];
您正在分配下面的内存段的块,其中matricola
仅约3个字节,这实际上意味着您只能在其中放置2个合法字节。
{
char nome[40];
char cognome[40];
short voto;
char matricola[3];
};
但是,在下面的一行中,您很有可能会越过边界,实际上破坏了相邻的块
fgets(matricola, 4, stdin);