C 不读取输入
我读了更多关于scanf的文章,发现了一些答案,但没有一个对我有帮助: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);} } } 问题是,在执行这行代码之后,什么也没有
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个值中的一个
- 如果返回
,则表示已读取一个值并将其放入tmp中1
- 如果它返回
,则表示缓冲区中有一个坏字符(您可以通过下一个0
检测并清除它)getchar()
- 如果返回
,则表示EOF
处于文件结束状态。无论您执行多少次stdin
s操作,“文件结束”条件不会消失,您将陷入无限循环getchar()
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在缓冲区中使用换行符或类似的东西是一个问题。