为什么要在该程序中使用fflush(stdin)?

加布里埃尔

我知道它是用来清理键盘缓冲区的,但是我不知道何时/为什么需要使用它,或者是否确实需要使用它。

例如,在我为我的课程编写的代码中,仅当我在后面紧接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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要在Java卡程序中使用“ setSeed()”?

来自分类Dev

为什么在写入stderr之前需要在stdout上使用fflush?

来自分类Dev

为什么要在AngularJS中使用$ onInit?

来自分类Dev

为什么要在golang中使用组合?

来自分类Dev

为什么要在 Angular 中使用 ValueAccessor?

来自分类Java

为什么要在Android中使用RequestQueue?

来自分类Dev

为什么要在Dialogflow中使用动作

来自分类Dev

为什么要在结构中使用malloc?

来自分类Dev

为什么要在FRP中使用行为

来自分类Dev

为什么要在延迟中使用setTimeout

来自分类Dev

为什么要在laravel中使用npm?

来自分类Dev

为什么要在Flux中使用“动作”?

来自分类Dev

为什么要在Flink中使用kafka

来自分类Dev

为什么要在Typescript中使用接口

来自分类Dev

为什么要在ListView中使用DataTemplate?

来自分类Dev

为什么C标准没有定义fflush(stdin)的行为?

来自分类Dev

为什么fflush(stdin)函数不起作用?

来自分类Dev

为什么要在Django中使用预先编写的审核程序包

来自分类Java

为什么需要在Java中使用非守护程序线程?

来自分类Dev

该程序中使用的逻辑是什么

来自分类Dev

什么是背景?为什么要在odoo中使用?

来自分类Javascript

为什么要在JavaScript变量的名称中使用$(美元符号)?

来自分类Dev

为什么要在Git中使用core.autocrlf = true?

来自分类Java

为什么要在main方法中使用SwingUtilities.invokeLater?

来自分类Dev

为什么要在“ if”语句中使用语句?

来自分类Java

为什么要在Java中使用`transient`关键字?

来自分类Dev

蜂巢:为什么要在选择中使用分区?

来自分类Dev

为什么要在Dropwizard指标中使用CachedGauage?

来自分类Dev

为什么要在执行脚本中使用bash?

Related 相关文章

热门标签

归档