我正在尝试为类编写一个实验室,但是在运行时的输出中,它只要求字符串一次,当它循环时,它会跳过让我输入它并转到下一个函数。我在那里放了一个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');