首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在getchar()之后调用stdin缓冲区时,read ()系统调用是否清除它?

在getchar()之后调用stdin缓冲区时,read ()系统调用是否清除它?
EN

Stack Overflow用户
提问于 2022-04-28 19:40:15
回答 2查看 99关注 0票数 1

下面的输出似乎表明,在getchar()之后调用read ()时,它清除了所有stdin。假设我输入了"Hello\n“:

代码语言:javascript
运行
复制
char buff;
int c;
c=getchar();
printf("%c\n",c); //output H

int res;
res=read(0,&buff,1); //no output, it prompts !!
printf("%c\n",buff);

然而,如果我倒置函数,行为是不同的。假设我再次键入"Hello\n“:

代码语言:javascript
运行
复制
char buff;

int res;
res=read(0,&buff,1);
printf("%c\n",buff); output H

int c;
c=getchar();
printf("%c\n",c); output e

有人能解释一下这里发生了什么吗?我用的是Mac操作系统

EN

回答 2

Stack Overflow用户

发布于 2022-04-29 12:38:30

下面的输出似乎表明,在getchar()之后调用read ()时,它清除了所有stdin。假设我输入了"Hello\n“:

不是的。将调用混合到getchar() (基于缓冲区的高级例程)和read() (读取所有内容的低级系统调用)。

这就是正在发生的事情:

调用getchar()的

  • ()
    • getchar()发出系统调用read()来填充缓冲区,从而获取所有可用的输入。输入存储在stdio缓冲区中,该缓冲区的第一个字符由getchar()返回。对getchar()的连续调用将返回存储在缓冲区中的下一个字符,直到耗尽为止,然后对read()的第二个调用将是made.

您调用的

  • () Read没有什么可返回的,或者下一个输入行将被返回,因为第一行中第一个后面的所有字符仍然在stdio缓冲区中,等待对fread、fgetch等的新调用(您可以再次调用getchar()来检查这一点,并查看这是如何实现的)

如果要混合调用,请在getchar()之后使用fread() (它知道并使用stdio缓冲区作为getchar()),而不是read()。

当您反转序列时,read()调用将为您提供已读取的所有内容( read ()中没有缓冲)。当您执行getchar()时,将进行第二个read() (因为缓冲区是空的)来填充该缓冲区。因此,您获得了所有的数据(在第一种情况下,如果在第一次读取之后执行了更多的getchar()s,当然是按错误的顺序得到的)

票数 2
EN

Stack Overflow用户

发布于 2022-04-28 22:38:28

如果您仍然使用此代码输入Hello\n,您将看到:

第一个getchar从stdin读取1个char,其中Hello\n被缓冲,所以它仍然是ello\n。

第二,要求read (这是一个阻塞函数)从stdin读取,因此它等待您输入一些文本(假设您键入"a\n"),它将返回'a‘。

然后,最后一个getchar将从第一步输出中的缓冲条目读取:

代码语言:javascript
运行
复制
    H
    a
    a
    e 

int main() {
char buff;
int c;
c=getchar();
printf("%c\n",c); //output 'H'

int res;
res=read(0,&buff,1); //it prompts the lettre you just entered here 'a'
printf("%c\n",buff);

c=getchar();
printf("%c\n",c); //output the rest of the buffered stdin 'e'

return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72049341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档