C语言 为什么我的冲水不起作用?跳过循环中请求字符串



我正在尝试为类编写一个实验室,但是在运行时的输出中,它只要求字符串一次,当它循环时,它会跳过让我输入它并转到下一个函数。我在那里放了一个fflush,但它不起作用。我正在使用Visual Studio 2015

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define size 3
struct empsal
{
    char first[15];
    int t1, t2, t3;
    float avg;
    char grade;
};
void load(struct empsal s[], int n)
{
    int i;
    for (i = 0; i<n; i++)
    {
        printf("Enter first name ");
        gets_s(s[i].first);
        printf("Enter 3 test scores ");
        scanf("%d%d%d", &s[i].t1, &s[i].t2, &s[i].t3);
        s[i].avg = (s[i].t1 + s[i].t2 + s[i].t3) / (float)3;
        if (s[i].avg>70)
            s[i].grade = 'p';
        if (s[i].avg<70)
            s[i].grade = 'f';
        fflush(stdin);
    }
}
void print(struct empsal s[], int n)
{
    int i;
    for (i = 0; i<n; i++)
    {
        printf("%sn", s[i].first);
        printf("%d %d %dn", s[i].t1, s[i].t2, s[i].t3);
        printf("Average is %f Grade is %cnn", s[i].avg, s[i].grade);
    }
}
//sort
void sort(struct empsal s[], int n)
{
    int i, j;
    empsal t;
    for (i = 0; i<n - 1; i++)
    {
        for (j = 0; j<n - 1; j++)
        {
            t = s[j];
            s[j] = s[j + 1];
            s[j + 1] = t;
        }
    }
}
//amount passed
void passed(struct empsal s[], int n)
{
    int count = 0;
    int i;
    for (i = 0; i<n; i++)
    {
        if (s[i].grade = 'p')
            count++;
    }
    printf("Number of passes %dnn", count);
}
void main()
{
    empsal s[size];//array
    load(s, size);
    sort(s, size);
    passed(s, size);
    print(s, size);
}

输出:

输入名字阿马尔输入 3 个测试分数 909090输入名字 输入 3 考试成绩 8090100输入名字 输入 3 考试成绩 906080通过次数 3

90 60 80平均值为 76.666664 等级为 p

阿马尔90 90 90平均值为 90.000000 等级为 p

80 90 100平均值为 90.000000 等级为 p

按任意键继续 . . .

根据标准定义fflush(stdin);调用未定义的行为。

引用C11,第7.21.5.2章(强调我的

如果stream指向输出流或更新流,其中最新的 未输入操作,fflush函数会导致该流的任何未写入数据 交付到主机环境以写入文件;否则,行为为 定义。

如果要清理剩余输入(和换行符)的输入缓冲区,请自行清理。一个简单的方法是

 while (getchar() != 'n');

最新更新