fgets正在影响输出

时间:2018-11-08 09:02:10

标签: c memory structure 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;
}

2 个答案:

答案 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);