【发布时间】:2015-06-20 14:36:56
【问题描述】:
我编写了一段代码来帮助自己理解当涉及stdin 和stdout 时事情是如何工作的。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
void prompt(){
int i=0;
printf("please select:\n"); //string1
printf("1.input\n2.print\n3.Exit\n"); //string2
scanf("%d",&i);
switch(i){
case 1:
printf("Data input!\n");
break;
case 2:
printf("data printed!\n");
break;
case 3:
exit(0);
case 10:
printf("Newline detected!"); //string3
default:
printf("Please input a valid number!(1-3)"); //string4
}
}
int main()
{
while(1)
prompt();
return 0;
}
我期望这段代码做的是:
- 提示我输入;
- 然后我输入一个数字 4,它不在案例中;
- 因此将匹配默认大小写并打印字符串“请输入有效的...”(字符串 4)。
- 由于标准输入缓冲区中仍有一个换行符,在下一个循环中, 变量 'i' 会自动得到一个换行符,在 ACSII 中是 10
- 所以在打印出“please select..1.input\n2.print....”后,会立即打印出字符串“检测到换行符!”(字符串 3)。
- 然后代码进入第三个循环,提示我输入......
但这永远不会发生。即使我输入数字 4,我也看不到任何“检测到换行符!”在输出中,这不在案例中。
谁能详细说明这个 sn-p 是如何工作的?
顺便说一句:我最初假设当标准输出中有打印的内容时,标准输入缓冲区会自动刷新。但一些事实证明我错了。我的假设是真的还是假的?
另外,当我输入一个字符(例如,g)而不是数字时,我在屏幕上无限打印了 string 1, string 2, sring 4。这是为什么呢?
编辑:查看答案后,我再做一个sn-p,以帮助理解。
#include<stdio.h>
#include<stdlib.h>
void output();
int main()
{
int i;
printf("Enter a number here:\n");
scanf("%d",&i);
output();
return 0;
}
void output(){
char a;
if (scanf("%c",&a)!=1){
printf("scanf error!!");
exit(1);
}
switch(a){
case 'a':
printf("an char a is entered");
break;
case 'b':
printf("an char b is entered");
break;
default:
printf("%c",a);
printf("other thing is entered");
}
}
无论您在程序第一次提示时输入什么内容,都不会得到第二次提示。例如,当程序第一次提示您时,如果您输入一个数字 4,那么您将在屏幕上打印一个换行符和一个字符串“输入了其他内容”。这是为什么?
【问题讨论】: