C 不读取输入

C 不读取输入,c,scanf,C,Scanf,我读了更多关于scanf的文章,发现了一些答案,但没有一个对我有帮助: while(!comanda){ int tmp; if (scanf("%d", &tmp) == 0) getchar(); else{ comanda = tmp; fprintf(stdout,"%d",&comanda); fflush(stdout);} } } 问题是,在执行这行代码之后,什么也没有

我读了更多关于scanf的文章,发现了一些答案,但没有一个对我有帮助:

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

问题是,在执行这行代码之后,什么也没有发生。在此之后,我检查了不执行的“comanda”。

scanf和所有格式化输入函数的问题之一是,终端倾向于在原始模式下运行,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;
}
#包括
int main(){
整数;
printf(“输入一个数字:”);
fflush(stdout);
while(scanf(“%d”,&a_编号)!=EOF){
printf(“您输入了%d\n”,一个\u编号);
printf(“输入另一个数字:”);
fflush(stdout);
}
返回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$
bash$gcc foo.c
美元/年
输入一个数字:12345678910
你输入了1
输入另一个数字:您输入了2
输入另一个数字:您输入了3
输入另一个数字:您输入了4
输入另一个数字:您输入了5
输入另一个数字:您输入了6
输入另一个数字:您输入了7
输入另一个数字:您输入了8
输入另一个数字:您输入了9
输入另一个数字:您输入了10
输入另一个数字:bash$
猛击$
每次调用
scanf
都从输入流中读取一个数字,但第一次调用直到我按下return后才返回。其余的调用立即返回,没有阻塞更多的输入,因为输入流已缓冲,它可以从流中读取另一个整数

替代方法是使用
fgets
一次性处理整行数据,或使用禁用。由于POSIX的终端接口部分不是在Windows下实现的,因此大多数人使用
fgets

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

  • 如果返回
    1
    ,则表示已读取一个值并将其放入tmp中
  • 如果它返回
    0
    ,则表示缓冲区中有一个坏字符(您可以通过下一个
    getchar()
    检测并清除它)
  • 如果返回
    EOF
    ,则表示
    stdin
    处于文件结束状态。无论您执行多少次
    getchar()
    s操作,“文件结束”条件不会消失,您将陷入无限循环
还测试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()
解析它-不应该有
&
。作为旁注,请说得更具体些。当你说“什么都没发生”时,代码停在哪里?封锁在哪里?编辑。现在它应该有意义了,“comanda”最初等于什么?最初comanda等于零。scanf在缓冲区中使用换行符或类似的东西是一个问题。