【问题标题】:C program skips fgets [duplicate]C程序跳过fgets [重复]
【发布时间】:2013-11-22 17:24:20
【问题描述】:

我的程序编译正常,但是当它调用 getinput() 函数时它从不提示输入。

编辑显示更多代码,我添加了 fflush 但由于某种原因它仍然跳过它。

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


main(){

    char mystring[] = "It's equal to it. ";
    int k = 32;
    int e;
    printf("Enter a number: ");
    scanf("%d",&e);
    if(e == k){
        printf("\n\n%s\n",mystring);

    } else if(e < k){
        printf("\n\n%d\n",e);

    } else {


        getinput();
    }

    exit(0);

}

int getinput(){

    char gettext[64];

    printf("Enter text here: ");
    fflush(stdout);
    fgets(gettext, 64, stdin);
    printf("\n\nYou entered: %s\n\n",gettext);
    return 0;


}

【问题讨论】:

  • 你的标题说它跳过了fgets,但你的问题更多的是关于printf
  • @WillBD 看起来这个问题是一个不同的问题,因为混合了scanffgets
  • 啊,很好,直到我提出我的意见后,我才看到你的评论(因此重新阅读了这个问题),很好。
  • @WillBD 事实证明你是有先见之明的。他在问题中添加了更多代码。
  • @Barmar 是的,但是在 getinput 函数中没有使用 scanf,所以我不明白为什么这很重要。

标签: c scanf


【解决方案1】:

scanf("%d",&amp;e) 这一行之后添加一个getchar(),如下所示:

scanf("%d",&e);
getchar();

当你按下Enter 时,换行符会留在缓冲区中,所以当调用fgets 时,换行符会传递给它,它的行为就像你按下了Enter

【讨论】:

  • 您对这里发生的事情有正确的认识。但是,getchar() 不是一个可靠的修复程序。我认为有一种方法可以在scanf() 格式中添加一些额外的内容,以使其“吃掉”该行的其余部分,但我仍在寻找最好的方法来做到这一点。当我有更多详细信息时,我会发布......
  • 好的,这似乎是可行的:scanf("%d%*[^\n]", &amp;e); assert('\n' == getchar()); 当然,断言是可选的(但 getchar() 不是)。我只是想确定我吃的是换行符,而不是偶然的其他角色。我添加的%*[^\n] 基本上说“匹配所有不是换行符的内容”([^\n] 模式)“但不要将其分配给任何变量”(这就是 * 所做的)。
【解决方案2】:

在第一次 printf 之后尝试调用 fflush(stdout);

printf 将为您刷新它,但前提是它的末尾有换行符(例如 printf("hi\n");

【讨论】:

  • 这是真的,OP 应该这样做。但是,这不是他询问的错误的原因。
  • 可能是 - 在他或她看来输入错误,但他通过 输出 判断...因此我的回答。
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多