1

当我想弄清楚 getchar() 实际做了什么时,这个小片段loop确实让我感到困惑。

int i;
int c;
for (i = 0; i < 100; i++) {
    c = getchar();
    printf("%d\n", c);    
    printf("i is %d\n", i);
}

输入输出为:

input: 1
output:
49
i is 0
10
i is 1

input: 12
output:
49
i is 2
50
i is 3
10
i is 4

正如我之前所假设的,如果我输入 1 个字符,getchar() 应该将其提取出来,putchar() 会打印它,然后程序进入下一个循环并等待我的下一个输入。但结果似乎表明代码没有按我的预期工作:

  1. 输出数字是什么意思?
  2. 总是有一个额外的循环打印10,这是什么10意思?如果这意味着EOF,为什么在循环内替换后c = getchar();c = (getchar() != EOF);代码总是打印出1哪个,正如我所料,应该0在最后一个循环中打印一个?

非常感谢!

4

2 回答 2

2

问题

输出数字是什么意思?

输出数字是指根据您的字符集的字符值,通常基于ASCII(一些大型机也使用EDCDIC)。

C11 (n1570),第 5.2.1 节字符集

应定义两组字符及其相关的整理顺序:写入源文件的字符集(源字符集)和在执行环境中解释的字符集(执行字符集)。每个集合进一步分为一个基本字符集,其内容由本子条款给出,以及一组零个或多个特定于语言环境的成员(它们不是基本字符集的成员),称为扩展字符。组合集也称为扩展字符集。执行字符集成员的值是实现定义的。

因此,通过这种字符编码,49 是字符'1',50 是字符'2'

问题

总是有一个额外的循环打印 10,这个 10 是什么意思?

对于 ASCII 字符集,10 是换行符 '\n'

当您'1'在键盘上键入字符时,标准输入流stdin实际上将接收两个字符 :'1''\n',因为您正在按下<Enter>以验证您的输入。

因此,您应该在完成getchar调用后清理标准输入流。实现它的一种可能方法是消耗每个字符,直到到达换行符或EOF

#include <stdio.h>

int c;

while ((c = getchar()) != '\n' && c != EOF)
  ;

在 BSD 上,也有该功能fpurge,并且在 Solaris 和 GNU/Linux__fpurge上可用。

问题

如果这意味着EOF,为什么在循环内替换后c = getchar();c = (getchar() != EOF);代码总是打印出1哪个,正如我所料,应该0在最后一个循环中打印一个?

的值EOF不能是 10,因为EOF必须有一个负值。

C11 (n1570), § 7.21.1 简介

EOF,它扩展为一个整数常量表达式,具有类型int和负值 [...]。

于 2013-03-24T15:33:59.070 回答
2

输出数字是什么意思?

字符的字符代码getchar()返回,因为您得到一个并且您正在使用说明符打印它%d。在这种情况下,您的字符编码似乎是 ASCII 或 UTF-8,因此1代表 49、502等。

2:[...太长无法引用...]

10 是换行符 ( '\n') 的 ASCII 和 Unicode 字符代码。由于您按 Enter (getchar()等待它!),您将获得Enter 发送到终端的字符。

于 2013-03-24T15:36:01.310 回答