网站地图
hnsjyk999.com
三九百科 包罗万象
stdin 发布于:

stdin是标准输入,一般指键盘输入到缓冲区里的东西。

stdin是标准输入 std即standard(标准),in即input(输入),合起来就是标准输入。 一般就是指键盘输入到缓冲区里的东西

示例:一个最简单的小程序,它的功能是从键盘输入字符,然后将其送到控制台。采用perl语言实现,你可以这样写:

简单地说,<STDIN>是一个专用的文件句柄,在本例中它属于标准输入缓存(称为STDIN),通常是连接到键盘。每次我们将<STDIN>的值赋给变量$line时,即为将STDIN缓存中的首行取出,然后放入$line。当到达缓存最后一行时,就会取出while语句判断条件为假的(EOF)文件结束标识符。程序的其它部分很简单可以这样解释。现在我们已经将输入信息放入$line变量,接着我们就可以用print函数将其打印到屏幕。或者更准确地说,打印到通常连接显示器的标准输出缓存。标准输入和输出缓存都可以重定向,例如可重定向到保存程序结果的某个文件中,如果是在处理文本,那么通常可以认为这与键盘及显示器是等价的。

你可能会认为这一程序已经是最短的了,但是通过使用perl的特殊变量,它还可以更短。

它还可以这样书写:

stdin流阻塞的分析

以scanf函数为例,运行下述程序

我们定义了a,b,c三个变量来接受输入的内容,定义了变量ret来接收scanf函数的返回值。

正确输入的话:

但是当输入内容与格式换字符串不匹配时,结果会令人大跌眼镜(仔细分析会对stdin流有更深入理解的哦):

执行到第一个scanf时,当输入字符’b’的时候与ret=scanf("%d%d%d",&a,&b,&c);中的格式化字符串不匹配,stdin流被阻塞,scanf函数不在读取后面的部分,直接将1返回,表示只将stdin流中的1读入到了变量a中。

执行到第二个scanf时,字符’b’还是与格式化字符串不匹配,stdin流仍然被阻塞,所以没有提示输入,scanf函数将0返回。

将代码作如下修改,可以有力的证明上述结论。

当把第二个scanf函数内的格式化字符串改为”%c%d%d”时,运行结果如下:

执行到第一个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);,清空输入缓冲区:

运行结果

stdin流在实际中经常由于一些不正确的使用发生阻塞,注意使用fflush(stdin);,可以解决很多问题哦!

stdout(Standardoutput)标准输出

stdin(Standardinput)标准输入

stderr(Standarderror)标准错误


相关文章推荐:
缓冲区 | 字符 | 缓冲区 | 字符 | 文件句柄 | 缓存 |