Gets / fgets跳过了C语言中的输入步骤

问题描述 投票:1回答:1

我有一个练习,我需要创建一个程序来输入学生的所有信息作为学生报告,作为下面的源代码。我有一个问题,我无法获得完整的流输入。它跳过了年级输入,然后跳到另一个学生输入下一个学生的ID。我已经将getchar()设置为\n,但这并没有帮助。我的问题在于开关的情况1,因此您只需要关心它,其他情况对我的问题没有任何意义。

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

#define MAX 1000
typedef struct 
{
    char id[10];
    char name[50];
    float grade;
    char assess;
}student;
char assess(int a)
{
    if(a<4.00)
    return 'F';
    if(4.00<=a<6.00)
    return 'D';
    if(6.00<=a<7.00)
    return 'C';
    if(7.00<=a<8.50)
    return 'B';
    if(8.50<=a<10.00)
    return 'A';
}
int main()
{
    int choice;
    int i=0, num=0; 
    int a=0, j=0;
    student std[MAX], temp;
    char search[50];
    do
    {
        printf("Student Report\n");
        printf("1.Input data\n2.Append data\n3.Sort data and print\n4.Search by names5.Quit\n");
        printf("Your choice is: ");
        scanf("%d", &choice);
        switch(choice)
      {
            case 1:
            {
                do{
                printf("How many students you want to add?\n");
                scanf("%d", &num);
                if(num<0 || num>50)
                printf("Your number must be positive or smaller than or equal to 50!\n");
                }while(num<0||num>50);
                for(i=a; i<num; i++)
                {
                    printf("Student's id No.%d:", i);
                    fgets(std[i].id, 10, stdin);
                    getchar();
                    printf("Student's name No.%d:", i);
                    fgets(std[i].name, 50, stdin);
                    getchar();
                    printf("Student's grade No.%d:", i);
                    scanf("%f", &std[i].grade);
                    std[i].assess=assess(std[i].grade);
                }
                a=num;
            }
            case 2:
            {
                do
        {
          printf("How many students you want to append?[0; %d]\n", MAX-num);
          scanf("%d", &num);
                }while(num<0||num>50-a);
                for(i=a; i<num+a; i++)
                {
                    printf("Student's id No.%d:", i);
                    fgets(std[i].id, MAX, stdin);
                    getchar();
                    printf("Student's name No.%d:", i);
                    fgets(std[i].name, MAX, stdin);
                    getchar();
                    printf("Student's grade No.%d:", i);
                    do
            {
              scanf("%f", &std[i].grade);
              if(std[i].grade<0||std[i].grade>10)
            printf("Please re-input grade, it must be between 0 and 10\n");
                    }while(std[i].grade<0||std[i].grade>10);
                    std[i].assess=assess(std[i].grade);
                }
                a=num+a;
            }
            case 3: 
            {
                for(i=0; i<a; i++)
                for(j=0; j<a; j++)
                {
                    if(std[i].grade<std[j].grade)
                    {
                        temp=std[i];
                        std[i]=std[j];
                        std[j]=temp;
                    }
                }
                printf("ID\tName\t\t\tGrade\t\tAssessment\n");
                for(i=0; i<a; i++)
                printf("%-10s%-50s%-10.2f%-10c\n", std[i].id, std[i].name, std[i].grade, std[i].assess);
            }
            case 4:
            {
                printf("Student's name who you want to search: ");
                fgets(search, MAX, stdin);
                getchar();
                for(i=0; i<a; i++)
                if(strcasecmp(search, std[i].name)==0)
                printf("%-10s%-50s%-10.2f%-10c\n", std[i].id, std[i].name, std[i].grade, std[i].assess);
            }
            case 5:
            break;
            default:
            {
                printf("Please reinsert your choice again\n");
                break;
        }
      }
    }while(choice!=5);
    return 0;
}
c loops input fgets gets
1个回答
0
投票

为了摆脱\n字符,我更喜欢使用strcspn。如果您使用Windows,则应改用"\r\n"

printf("Student's id No.%d:", i);
fgets(std[i].id, 10, stdin);
std[i].id[strcspn(std[i].id, "\n")] = 0;
printf("Student's name No.%d:", i);
fgets(std[i].name, 50, stdin);
std[i].name[strcspn(std[i].name, "\n")] = 0;
printf("Student's grade No.%d:", i);
scanf("%f", &std[i].grade);
std[i].assess=assess(std[i].grade);

此外,asses功能可以简化如下。

char assess(double a)
{
    if(a < 4.00)
        return 'F';
    if(a < 6.00)
        return 'D';
    if(a < 7.00)
        return 'C';
    if(a < 8.50)
        return 'B';
    if(a < 10.00)
        return 'A';
    else
        return -1; // the error indicator to be handled.
}

此外,在每个case之后,您应该放置break语句。浏览switch用法。

© www.soinside.com 2019 - 2024. All rights reserved.