首页 > 解决方案 > 为什么连续的 fget 接受输入但在循环打印时将其存储为不同的或空白数据?

问题描述

我是编码初学者,使用 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

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

标签: cfgets

解决方案


在您的最终打印中添加换行符为我解决了这个问题。@Jonathan Leffer的评论也是正确的,您可能会砍掉您的输入或超出缓冲区,使其保持如此之小,如果内存空间不是限制,最好提供比可能需要的更多空间。

话虽如此,我对其进行了一些清理并添加了这些换行符,以下代码似乎按预期运行。我还注释掉了一些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;
}

推荐阅读