arrays - 我正在阅读“The C Programming Language”(第 2 版),但我不理解一个概念:
问题描述
我正在阅读“C 编程语言”(2ed),但我不理解一个概念。
有此代码可将输入复制到输出
#include <stdio.h>
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
一开始,c
它被声明为一个int
类型变量,但如果我写了“测试线”之类的东西,那么输出就是预期的“测试线”。我的问题是:如何c
声明为int
类型变量,但程序存储空间足以存储大量字符?“内部”计算机,它注册为一个字符数组?这个过程是如何工作的?
解决方案
但是如果我写类似“测试线”的东西,输出就是预期的“测试线”。
“c”如何声明为
int
类型变量,但程序存储的空间足以容纳很多字符?
所有输入不会同时存储在变量c
中,而是存储在输入和输出缓冲区中。变量c
一次处理一个字符。
让我们看看事件的顺序。
main()
开始并运行到getchar()
.getchar()
等待输入。用户类型
t
,操作系统缓冲字符。用户类型
e
s
......,e
操作系统缓冲这些字符。用户类型Enter,操作系统缓冲字符
'\n'
并提供缓冲区以stdin
供getchar()
开始使用。getchar()
返回t
并保存在c
.代码继续
putchar(c);
并将其t
放入stdout
缓冲区。代码继续
getchar();
,返回缓冲e
并保存在c
.代码继续
putchar(c);
并将其e
放入stdout
缓冲区。8 - 9 重复
st line
。代码继续
getchar();
,返回缓冲\n
并保存在c
.代码继续
putchar(c);
并将其\n
放入stdout
缓冲区。缓冲区现在被刷新到 OS 输出终端。输出现在可见。返回第 2 步,直到没有可用的输入。
推荐阅读
- javascript - 自定义 ajax 承诺函数签名
- reactjs - 如何从 React 中的父组件调用 onChange 访问内部虚拟 DOM 元素
- r - 如何在 RStudio 编辑器中删除垂直线?
- operating-system - 为什么此代码中没有加载 gdt?
- javascript - 如何从函数返回之前定义的 useRef 变量?
- swift - UISlider 的自定义形状并在 Swift 5 中更新进度
- php - PHP7 const 在条件(如果)内的要求(外部文件)中定义正在工作 - 为什么?
- ruby - 如何在 ruby 的方法中返回 true 或 false?
- ffmpeg - ffmpeg 将多个 mp3 文件添加到特定位置的 mp4 视频
- c++ - std::vector::reserve 实际上是如何工作的?