为什么我的fflush不起作用?跳过循环要求字符串

时间:2016-05-20 19:59:23

标签: c fflush

我正在尝试为类编写实验室但是在输出时我运行它只需要一次字符串,当它循环时跳过它让我输入它并转到下一个函数。我在那里放了一个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("%s\n", s[i].first);
        printf("%d %d %d\n", s[i].t1, s[i].t2, s[i].t3);
        printf("Average is %f Grade is %c\n\n", 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 %d\n\n", count);
}

void main()
{
    empsal s[size];//array
    load(s, size);
    sort(s, size);
    passed(s, size);
    print(s, size);
}

输出:

输入名字ammar 输入3个测试分数90 90 90 输入名字输入3个测试分数80 90 100 输入名字输入3个测试分数90 60 80 传球次数3

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

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

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

按任意键继续。 。

1 个答案:

答案 0 :(得分:0)

按标准定义fflush(stdin);调用undefined behavior

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

  

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

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

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