程序不执行的scanf(后得到()),即使使用fflush(标准输入)程序不执行的scanf(后得到

2019-05-12 10:03发布

使用scanf()的后浪费太多的时间来搜索,为什么我的程序不执行gets()函数后,我发现了一个解决方案,就是使用fflush(标准输入)的scanf()后,使得到()得到一个字符串。

问题是,fflush(标准输入)不会做什么是由它预计:该程序继续跳过得到()和我不能写在控制台中的任何短语被读取。

我的代码是下一个:

#include <string.h>
#include <stdio.h>

int main(){
    char nombre[10];
    char mensaje[80];

    printf("Type your name:\n");
    scanf("%s", nombre);

    fflush(stdin);

    printf("Now, type a message:\n");
    gets(mensaje);

    printf("3/%s:%s",nombre,mensaje);
    return 0;
}

Answer 1:

如果冲洗STD不工作,然后尝试读取多余的字符和丢弃,如建议在这里 。

这将工作:

#include <string.h>
#include <stdio.h>

int main(){
    char nombre[10];
    char mensaje[80];
    int c;

    printf("Type your name:\n");
    scanf("%9s", nombre);

    while((c= getchar()) != '\n' && c != EOF)
            /* discard */ ;

    printf("Now, type a message:\n");
    gets(mensaje);

    printf("%s:%s",nombre,mensaje);
    return 0;
}


Answer 2:

两个大,主要问题:

  1. 不要使用fflush对输入流 ; 的行为fflush没有定义在输入流。 只是因为它似乎在这种情况下工作,并不意味着它是正确的。

  2. 永远永远永远永远永远永远不要使用gets -这是过时的C99标准,并已经从C2011标准完全去除。 这 (可能不 )在你的代码引进失败的一大看点。

这是不是一个好主意遵循scanf调用与gets的呼叫,因为gets不会跳过留下的输入流中的任何领先的换行符scanf 。 使用scanf读取这两种 nombremesaje

printf("Type your name:\n");
scanf("%9s", nombre);

printf("Now, type a message:\n");
scanf("%79s", mensaje);

它是用在一个明确的长度说明一个好主意, scanf呼吁%s%[ ,否则你介绍的一样安全漏洞gets呢。

编辑

D'哦。 我是个白痴。 如果你想读取包含空格的字符串,你不能使用%s转换符。 使用%[转换符,而不是:

scanf( "%79[^\n]", mensage );

将读取到下一个79个字符或换行,以先到者为准,并保留输入流中的换行符。



Answer 3:

试试这个:

scanf("%s\n", nombre);

阅读部分时的scanf停在空白。 得到读取,直到第一个新的生产线。 所以会发生什么是scanf的叶子在缓冲区,它得到立即看到,认为它被赋予一个空行换行后面。

如果你把你的原代码,并输入“姓名的消息”,两片都在同一行,你可以看到在行动这一点 - 获取仍将立即返回,但它会看到第二部分。

在scanf的东西\ n告诉它继续前进,消耗太多。



Answer 4:

尝试gets(stdin); 代替

fflush(stdin);


Answer 5:

while (fgetc(stdin) != '\n'); // seems to work


文章来源: Program doesn't execute gets() after scanf(), even using fflush(stdin)