scanf不等待输入。

4

我正在尝试找到错误,但还是不明白。 我一直在调试和搜索,并找到了一些相关的主题,但只有我现在不需要的解决方案,我很好奇为什么这段代码不起作用:

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

#define BUFFER 256

int main()
{   
    int missionCode;
    char *desc = (char*)malloc(sizeof(char)*BUFFER);

    do {
        printf("Please enter the mission code (or -1 for exit): ");
        scanf("%d", &missionCode);
        fflush(NULL);
        if (missionCode==-1)
            return 1;
    } while (missionCode>10);

    do {
        printf("Please enter a string:\n");
        scanf("%[^\n]s", desc); //it doesn't stop here!
        fflush(NULL);
        if (!strcmp("exit",desc))
            return 1;
    } while (strlen(desc)<20);

    printf("your string:\n%s", desc);
    return 0;
}

第二个循环中的scanf\flushall出了问题,但我不知道是什么问题。 顺便说一下,这当然是C语言。


@MockingBird,你的代码中为什么要刷新一个NULL指针,即fflush(NULL) - Ganesh
1
@Ganesh fflush(NULL) 刷新所有打开的输出流。 - Daniel Fischer
@DanielFischer 谢谢你。我同意你的评论。我的疑惑更多是关于在我们只阅读时刷新输出。我试图理解刷新输出的动机。 - Ganesh
@Ganesh 这是一个很好的问题。 - Daniel Fischer
谢谢大家,但正如Daniel Fischer所说:将scanf(“%[^\n]s”,desc)更改为scanf(“%[^\n]s”,desc)即可解决问题。 - Mockingbird
1个回答

6
scanf("%d", &missionCode);

该函数将换行符留在缓冲区中,因此

scanf("%[^\n]s", desc);

立即找到一个并停止。您可以添加一个空格

scanf(" %[^\n]s", desc);

将格式设置为忽略前导空格。


首先,谢谢。现在它可以工作了。 但我还有一个问题,你说的“scanf("%d", &missionCode);”会在缓冲区中留下换行符是什么意思? 当我使用fflush(NULL)时,它会清空缓冲区,对吗? 或者你是指清空缓冲区类似于“换行符”在缓冲区中的作用? 非常感谢。 - Mockingbird
不,“fflush(NULL)”仅刷新输出流。 刷新输入流是未定义行为,尽管一些实现保证它会执行某些合理的操作。 你在输入中得到了一个换行符,因为(通常),程序只在键入换行符后才接收任何输入[在类Unix系统上,也可以通过Ctrl + D将不在行首的输入发送到程序]。该换行符没有被“scanf("%d",& missionCode)”所消耗,它仍然留存在输入缓冲区中。 您还可以使用(重复的)“getchar()”清空输入缓冲区,直到找到换行符为止。 - Daniel Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接