stdin是标准输入 std即standard(标准),in即input(输入),合起来就是标准输入。一般就是指键盘输入到缓冲区里的东西
示例:一个最简单的小程序,它的功能是从键盘输入字符,然后将其送到控制台。采用perl语言实现,你可以这样写:
while($line=
print$line;
简单地说,
你可能会认为这一程序已经是最短的了,但是通过使用perl的特殊变量,它还可以更短。
它还可以这样书写:
| 1 2 3 4 | while( { print; } |
stdin流阻塞的分析
以scanf函数为例,运行下述程序
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | #include int main (int argc, char * argv[]) { int a = 0; int b = 0; int c = 0; int ret = 0; ret = scanf("%d %d %d",&a,&b,&c); printf("第一次读入数量:%d\n",ret); ret = scanf("%d %d %d",&a,&b,&c); printf("第二次读入数量:%d\n",ret); return 0; } |
我们定义了a,b,c三个变量来接受输入的内容,定义了变量ret来接收scanf函数的返回值。
正确输入的话:
stdin
但是当输入内容与格式换字符串不匹配时,结果会令人大跌眼镜(仔细分析会对stdin流有更深入理解的哦):stdin
执行到第一个scanf时,当输入字符’b’的时候与ret=scanf("%d%d%d",&a,&b,&c);中的格式化字符串不匹配,stdin流被阻塞,scanf函数不在读取后面的部分,直接将1返回,表示只将stdin流中的1读入到了变量a中。执行到第二个scanf时,字符’b’还是与格式化字符串不匹配,stdin流仍然被阻塞,所以没有提示输入,scanf函数将0返回。
将代码作如下修改,可以有力地证明上述结论。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | #include int main (int argc , char * argv[]) { int a = 0; int b = 0; int c = 0; int ret = 0; ret = scanf("%d %d %d",&a,&b,&c); printf("第一次读入数量:%d\n",ret); ret = scanf("%c %d %d",&a,&b,&c); printf("第二次读入数量:%d\n",ret); return 0; } |
当把第二个scanf函数内的格式化字符串改为”%c%d%d”时,运行结果如下:
stdin
执行到第一个scanf函数时,由于输入’b’的原因scanf函数直接返回1,stdin流阻塞。执行到第二个scanf函数时,字符’b’与格式化字符串”%c%d%d”中的%c匹配,stdin流终于疏通,在输入6,则将变量a,b,c分别赋值为98(‘b’的ASCII码)、2、6,scanf函数返回3。
在scanf函数使用fflush(stdin);,清空输入缓冲区:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include int main (int argc ,char * argv[]) { int a = 0; int b = 0; int c = 0; int ret = 0; ret = scanf("%d %d %d",&a,&b,&c); fflush(stdin); printf("第一次读入数量:%d\n",ret); ret = scanf("%d %d %d",&a,&b,&c); fflush(stdin); printf("第二次读入数量:%d\n",ret); return 0; } |
运行结果
stdin
stdin流在实际中经常由于一些不正确的使用发生阻塞,注意使用fflush(stdin);,可以解决很多问题哦!stdout(Standardoutput)标准输出
stdin(Standardinput)标准输入
stderr(Standarderror)标准错误