首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用getchar()和getchar()行为时的额外循环

使用getchar()和getchar()行为时的额外循环
EN

Stack Overflow用户
提问于 2013-03-24 15:29:44
回答 2查看 995关注 0票数 1

当我想弄清楚getchar()实际上是做什么的时候,这一小块loop确实让我感到困惑。

代码语言:javascript
复制
int i;
int c;
for (i = 0; i < 100; i++) {
    c = getchar();
    printf("%d\n", c);    
    printf("i is %d\n", i);
}

投入和产出是:

代码语言:javascript
复制
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() != EOF);替换c = getchar();之后,代码总是打印1,正如我所设想的,应该在最后一个循环中打印一个0

太棒了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-24 15:33:59

问题 输出数字是什么意思?

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

C11 (n1570),§5.2.1字符集 应该定义两组字符及其相关的排序序列:写入源文件的集合(源字符集)和在执行环境中解释的集(执行字符集)。每个集合被进一步划分为一个基本字符集(其内容由这个子子句提供)和一组零或多个特定于地区的成员(它们不是基本字符集的成员),称为扩展字符。组合集也称为扩展字符集。执行字符集成员的值是实现定义的。

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

问题 总是有一个额外的循环打印10,这10意味着什么?

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

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

因此,一旦完成了getchar调用,就应该清除标准输入流。实现这一目标的一种可能方法是使用所有字符,直到到达换行符或EOF为止。

代码语言:javascript
复制
#include <stdio.h>

int c;

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

在BSD上,也有函数fpurge,而在Solaris和GNU上,__fpurge是可用的。

问题 如果它的意思是EOF,为什么在循环中用c = (getchar() != EOF);替换c = getchar();之后,代码总是打印1,正如我所设想的,应该在最后一个循环中打印一个0

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

C11 (n1570),§7.21.1导言 EOF,它扩展为整数常量表达式,具有int类型和负值.

票数 2
EN

Stack Overflow用户

发布于 2013-03-24 15:36:01

输出数字是什么意思?

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

2:.太长了不能引用..。

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

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

https://stackoverflow.com/questions/15600349

复制
相关文章

相似问题

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