我知道它是用来清理键盘缓冲区的,但是我不知道何时/为什么需要使用它,或者是否确实需要使用它。
例如,在我为我的课程编写的代码中,仅当我在后面紧接fflush(stdin)
主函数时,该函数才起作用while
,并且我只知道这一点,因为在我向他展示错误之后,教授告诉我这样做。
问题是否与struct有关,这就是为什么我应该使用 fflush(stdin)
?
这是代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct CLIENTES
{
int ano_nasc, cpf[11];
float renda_m;
char nome[50];
}; //Lista de Objetos
int main(void)
{
//Declaracao de Variaveis
int cont=0, num, num_2, client, i, j;
CLIENTES *vet;
//Leitura de Dados
printf("Digite o numero de Clientes: ");
scanf("%d%*c", &num);
vet = (CLIENTES*)malloc(num*sizeof(*vet));
printf("Digite os Dados do Cliente.");
while (cont != num)
{
fflush(stdin);
printf("\nNome: ");
fgets(vet[cont].nome, sizeof(vet[cont].nome), stdin);
printf("\nAno de Nascimento: ");
scanf("%d", &vet[cont].ano_nasc);
printf("\nCPF: ");
scanf("%d", &vet[cont].cpf);
printf("\nRenda Mensal: ");
scanf("%f", &vet[cont].renda_m);
cont++;
}
printf("\nDigite o numero do cliente que voce deseja conferir: ");
scanf("%d", &num_2);
for (i=0;i<num;i++)
{
if(num_2 == num)
{
printf("\nO que deseja saber sobre ele?\n");
printf("1-Nome\n2-Ano de Nascimento\n3-CPF\n4-Renda Mensal\n\n\n");
scanf("%d", &client);
if (client == 1)
{
printf("Nome: %s", vet[(num_2)-1].nome );
}
else if(client == 2)
{
printf("Ano de Nascimento: %d", vet[num_2].ano_nasc );
}
else if(client == 3)
{
for(j=0;j<11;j++)
{
printf("CPF: %d", vet[num_2].cpf[j]);
}
}
else if(client == 4)
{
printf("Renda Mensal: %f", vet[num_2].renda_m );
}
}
}
//Finalizando o Programa
printf("\n\nFim do Programa!");
getch();
return 0;
}
实际上,如果教授谈到标准C ,教授是错误的。根据该标准,调用fflush
输入流(例如stdin
)是未定义的行为。
但是,在许多实现中(包括Linux†,OS X,各种BSD等),都fflush(stdin)
将丢弃已缓冲但尚未使用的所有输入。此非标准功能在您的程序中用于清除前一个命令在输入缓冲区中留下的尾随换行符scanf
。
man fflush
在Linux上足够好地提到这是非标准的(尽管措辞并没有完全暗示未定义的行为):
这些标准未指定输入流的行为。
同时7.21.5.2fflush
下的C11标准功能说明:
如果
stream
指向未输入最新操作的输出流或更新流,则该fflush
函数会使该流的所有未写入数据都被传递到主机环境中,并被写入文件中;否则,行为是不确定的。
†根据评论,尽管man fflush
声称它应该,但这种非标准行为可能无法在Linux上运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句