首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在连续调用期间,STDIN缓冲区和getchar()指针是如何变化的?

在连续调用期间,STDIN缓冲区和getchar()指针是如何变化的?
EN

Stack Overflow用户
提问于 2014-07-27 15:13:17
回答 1查看 1K关注 0票数 3

给定stdin缓冲区中的输入,在执行对getchar()的连续调用时,指针是否沿着stdin缓冲区的内存地址移动,允许getchar()在每个地址检索值?如果是的话,一旦检索到它们,值是否被移除,指针就会增加?

通常,我对循环中getchar()的理解遵循以下逻辑:

  1. getchar()调用
  2. stdin缓冲区检查输入
  3. 如果stdin缓冲区为空,getchar()将休眠
  4. 用户输入并唤醒get char()
  5. stdin缓冲区再次检查输入
  6. stdin缓冲区不为空
  7. getchar()在stdin缓冲区开头的地址处检索值
  8. 值从stdin缓冲区中移除,指针增加。
  9. 后续调用重复步骤7-8,直到EOF遇到

以前在stackoverflow上也问过一个类似的问题,但我很难理解答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-27 15:54:18

通常有一个stdio内部缓冲区。getchar()可能触发读入缓冲区的一行,通常在随后的调用中,它只会增加一个指针,直到指针到达缓冲区中当前数据的末尾。实现通常对一个底层的动态内存块使用一个简单的内部char *,其中有几个指针和状态变量。

实现各不相同,我不记得POSIX标准在一般情况下暗示了getchar()或stdio流的内部实现,只是应该支持给定的操作。

如果我还记得,有些实现是未缓冲的(我认为我使用的DOS编译器没有缓冲),但是对于给定的操作系统有多个标准的lib实现。

在同一个系统上有两个stdio库并不少见,例如:管理AIX、Solaris、HPUX和其他非Linux/BSD UNIX平台的system将经常安装GNU堆栈以获得像gcc这样的工具,该堆栈包括glibc (GNU LIBC)。

您可以在线下载libc/stdio源。见格利伯。

如果有帮助,请考虑stdio提供了peek和unget功能,唯一的方法是在终端和用户程序之间设置内部缓冲区。

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

https://stackoverflow.com/questions/24982311

复制
相关文章

相似问题

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