为什么连续的 fgets 接受输入但在循环打印时将其存储为不同或空白数据?

Why does consecutive fgets accept input but stores it as a different or blank data when printed in a loop?

我是编码初学者,使用 fgets 时遇到问题,因为它接受我放置的输入,但是当我尝试使用 printf 输出它时,它不是正确的输入。

如果答案很明显,我很抱歉,但我已经在这个问题上停留了一个小时。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
    int eh;
    char name[32];
    char idnum[32];
    char coursename[9][20];
    int numberofcourses;
    int unit[9];
    float grade[9];
}information;

int main(){
    char id[32];
    char course_name[12];
    information info[21];
    char buf[3];
    int numberofstud;
    printf("Enter Number of Students:");
    fgets(buf, sizeof buf, stdin);
    sscanf(buf, "%d", &numberofstud);
    fflush(stdin);
    for(int i=0; i<numberofstud;i++){
        printf("Enter UP Student Number:");
        fgets(info[i].idnum, sizeof info[i].idnum, stdin);
        printf("Enter Name:");
        fgets(info[i].name, sizeof info[i].name, stdin);
        printf("Enter Number of Enrolled Courses:");
        fgets(buf, sizeof buf, stdin);
        sscanf(buf, "%d", &info[i].numberofcourses);
        getchar();
        for(int j=0; j<info[i].numberofcourses;j++){
            printf("Enter Course Name:");
            fgets(buf, sizeof info[i].coursename[j], stdin);
            sscanf(buf, "%s", &info[i].coursename[j]);
            printf("Enter Course Units:");
            fgets(buf, sizeof info[i].unit[j], stdin);
            sscanf(buf, "%d", &info[i].unit[j]);
            printf("Enter Course Grade:");
            fgets(buf, 5, stdin);
            sscanf(buf, "%f", &info[i].grade[j]);
            getchar();
        }
    }
    for(int i=0; i<numberofstud;i++){
    printf("%s", info[i].idnum);
    printf("%s", info[i].name);
        for(int j=0; j<info[i].numberofcourses;j++){
            printf("%s, %d, %.3f", info[i].coursename[j], info[i].unit[j], info[i].grade[j]);
        }
    }
    return 0;
}

这是我尝试 运行 程序

时发生的情况的示例

示例输出:



Enter Number of Students:1
Enter UP Student Number:412412
Enter Name:Martinez
Enter Number of Enrolled Courses:1

Enter Course Name:CMSC 11
Enter Course Units:2
Enter Course Grade:3

412412

CMSC, 2, 3.000

我也不介意您指出我代码中的任何错误或不良做法,以便我不断改进!谢谢你的时间。

在你的最终打印中加入一个换行符为我解决了这个问题。另外 @Jonathan Leffer 的评论是正确的,你可能会砍掉你的输入或溢出一个缓冲区,让它保持这么小,如果内存 space 不是限制,最好提供比可能需要更多的空间.

话虽如此,我稍微清理了一下并添加了那些换行符,以下代码似乎按预期运行。我还注释掉了一些 getchar 调用和一个 fflush,如果删除这些是错误的,我将它们保留在取消注释中。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
    int   eh;
    char  name[32];
    char  idnum[32];
    char  coursename[9][20];
    int   numberofcourses;
    int   unit[9];
    float grade[9];
}information;

int main(){
    char         id[32];
    char         course_name[12];
    information  info[21];
    char         buf[32]; //Increased your buffer size
    int          numberofstud;
    
    printf("Enter Number of Students:");
    fgets(buf,sizeof(buf),stdin);
    sscanf(buf, "%d", &numberofstud);
    //fflush(stdin);
    for(int i=0; i<numberofstud;i++){
        printf("Enter UP Student Number:");
        fgets(info[i].idnum,sizeof(info[i].idnum),stdin);
        
        printf("Enter Name:");
        fgets(info[i].name,sizeof(info[i].name),stdin);
        
        printf("Enter Number of Enrolled Courses:");
        fgets(buf,sizeof(buf),stdin);
        sscanf(buf, "%d", &info[i].numberofcourses);
        //getchar();
        for(int j=0; j<info[i].numberofcourses;j++){
            
            printf("Enter Course Name:");
            fgets(buf,sizeof(buf),stdin);
            sscanf(buf, "%s", &info[i].coursename[j]);
        
            printf("Enter Course Units:");
            fgets(buf,sizeof(buf),stdin);
            sscanf(buf, "%d", &info[i].unit[j]);
            
            printf("Enter Course Grade:");
            fgets(buf,sizeof(buf),stdin);
            sscanf(buf, "%f", &info[i].grade[j]);
            //getchar();
        }
    }
    for(int i=0; i<numberofstud;i++){
        printf("%s\n", info[i].idnum);
        printf("%s\n", info[i].name);
        for(int j=0; j<info[i].numberofcourses;j++){
            printf("%s, %d, %.3f", info[i].coursename[j], info[i].unit[j], info[i].grade[j]);
        }
    }
    return 0;
}