c - 探索 getchar() 函数
问题描述
我对 C 很感兴趣,所以我想更多地探索 C,尤其是 C89,看看这种语言随着时间的推移是如何变化的 :)。我买了 Denis Ritchie 的“The C programming language”(第 2 版)。
书中的一个例子让我想到了一个关于 getchar() 函数的复杂情况。
阅读本书后的示例1是我的示例:
#include <stdio.h>
int main()
{
int c = getchar();
printf("\'\\n\' character in c: %d\n", c == '\n');
printf("\'\\n\' character in c: %d\n", c == '\n');
}
示例 1 的输出为:
a
'\n' character in c: 0
'\n' character in c: 0
在这种情况下,输出不会在此输入中显示任何换行符。但是,我尝试的另一个例子是:
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF) {
printf("\'\\n\' character in c: %d\n", c == '\n');
}
}
代码的输出是:
a
'\n' character in c: 0
'\n' character in c: 1
我不明白为什么第二个示例复制了 printf() 函数,以及它在进入循环时如何读取 '\n' 字符。同时,第一个示例没有显示与 '\n' 字符相关的任何内容
解决方案
- 您键入
a
并按回车键。标准输入缓冲区将看起来像a
,\n
, 两个字符。 - 循环中的第一圈,
c
值为'a'
,不等于'\n'
,输出 0。 - 循环中的下一圈,
c
值为'\n'
,等于'\n'
,输出 1。 - 在输入结束时
c
变为时EOF
,printf
永远不会执行。
推荐阅读
- angular - Angular ngFor 不使用材料,因为它不是已知属性
- javascript - JavaScript:在类中使用原型方法来控制台日志### 代替数组中的字母
- lua - 检查球和砖块之间的碰撞
- python - sklearn 中的 roc_curve:为什么它不能正常工作?
- python - 我可以将半个高斯拟合到 Python 中的数据集吗?
- android - 在 Flutter 中构建小部件之前如何获取用户的首选语言?
- c++ - 独立子任务执行
- ios - UNUserNotificationCenter 可以添加多个请求吗?
- intellij-idea - 在 IntelliJ 或 Android Studio 中热重载期间,Flutter 应用程序暂停了大约 30 秒到 1 分钟
- visual-studio-2017 - 如何使用当前文本选择自动填充“转到所有内容”[ctrl + t]