scanf没有读取输入

时间:2011-03-13 13:07:41

标签: c scanf

我阅读了更多关于scanf的帖子,我找到了一些没有帮助我的答案:

while(!comanda){
    int tmp;
    if (scanf("%d", &tmp) == 0)
        getchar();
    else{
        comanda = tmp;
        fprintf(stdout,"%d",&comanda);
        fflush(stdout);}
    }
}

问题是在执行这行代码后,没有任何反应。在此之后,我检查了“comanda”,但没有执行。

2 个答案:

答案 0 :(得分:2)

scanf和所有格式化输入函数的问题之一是终端倾向于在line mode or cooked mode中运行,而API是针对原始模式设计的。换句话说,scanf实现通常在遇到换行符之前不会返回。输入被缓冲,以后对scanf的调用将消耗缓冲的行。请考虑以下简单程序:

#include <stdio.h>

int main() {
    int a_number;
    printf("Enter a number: ");
    fflush(stdout);
    while (scanf("%d", &a_number) != EOF) {
        printf("you entered %d\n", a_number);
        printf("Enter another number: ");
        fflush(stdout);
    }
    return 0;
}

在按 return 之前,您可以输入多个数字。以下是运行此程序的示例。

bash$ gcc foo.c
bash$ ./a.out
Enter a number: 1 2 3 4 5 6 7 8 9 10<Return>
you entered 1
Enter another number: you entered 2
Enter another number: you entered 3
Enter another number: you entered 4
Enter another number: you entered 5
Enter another number: you entered 6
Enter another number: you entered 7
Enter another number: you entered 8
Enter another number: you entered 9
Enter another number: you entered 10
Enter another number: <Ctrl+D>bash$ 
bash$

每次调用scanf都会从输入流中读取一个数字,但是在我按下 return 之后,第一次调用才会返回。其余的调用立即返回而不会阻塞更多输入,因为输入流是缓冲的,它可以从流中读取另一个整数。

替代方法是使用fgets并一次处理整行数据,或使用the terminal interface禁用"canonical input processing"。大多数人使用fgets,因为POSIX的终端接口部分未在Windows下实现。

答案 1 :(得分:0)

您的scanf("%d", &tmp)可以返回3个值中的一个

  • 如果它返回1,则表示已读取值并将其放入tmp
  • 如果它返回0,则表示缓冲区中存在错误的字符(您使用下一个getchar()检测并删除它)
  • 如果它返回EOF,则表示stdin处于文件结束状态。无论你做了多少getchar()次,“文件结束”条件都不会消失,而且你会陷入无限循环。

还测试scanf的返回值是否为EOF。

while(!comanda){
    int tmp;
    int ret;
    ret = scanf("%d", &tmp);
    if (ret == 0)
        getchar();
    else if (ret == EOF){
        perror("stdin end-of-file");
        break; /* get out of the loop */
    }
    else {
        comanda = tmp;
        fprintf(stdout,"%d",comanda); /* & is an error */
        fflush(stdout);}
    }
}

或者,即使更好,重做您的计划,使用fgets()阅读整行并使用sscanf()进行解析。