使用getchar()时的额外循环以及getchar()的实际行为

使用getchar()时的额外循环以及getchar()的实际行为,c,loops,C,Loops,当我想弄清楚getchar实际上做了什么时,这个小循环确实让我感到困惑 int i; int c; for (i = 0; i < 100; i++) { c = getchar(); printf("%d\n", c); printf("i is %d\n", i); } 正如我之前所设想的,如果我输入1个字符,getchar应该将其提取出来,putchar将打印它,然后程序移动到下一个循环并等待我的下一个输入。但结果似乎表明代码并不像我想象的那样工作:

当我想弄清楚getchar实际上做了什么时,这个小循环确实让我感到困惑

int i;
int c;
for (i = 0; i < 100; i++) {
    c = getchar();
    printf("%d\n", c);    
    printf("i is %d\n", i);
}
正如我之前所设想的,如果我输入1个字符,getchar应该将其提取出来,putchar将打印它,然后程序移动到下一个循环并等待我的下一个输入。但结果似乎表明代码并不像我想象的那样工作:

输出数字意味着什么? 总是有一个额外的循环打印10,这10是什么意思?如果它意味着EOF,为什么在替换c=getchar之后;c=getchar!=EOF;在循环中,代码总是打印1,正如我所想,应该在最后一个循环中打印0? 非常感谢

问题 输出数字意味着什么

输出数字是指根据字符集的字符值,通常也基于某些大型机使用

C11 n1570,§5.2.1字符集 应定义两组字符及其相关的排序顺序:中的 哪些源文件写入源字符集,以及在 执行环境-执行字符集。每组又分为一组 基本字符集,其内容由本子条款给出,以及一个零或多个字符集 特定于语言环境的成员,这些成员不是名为 扩展字符。组合集也称为扩展字符集。这个 执行字符集成员的值由实现定义

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

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

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

当您在键盘上键入字符“1”时,标准输入流stdin实际上会收到两个字符:“1”和“\n”,因为您正在按以验证输入

因此,在完成getchar调用后,应该清理标准输入流。一种可能的实现方法是使用每个字符,直到达到换行符或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,值为负值[…]

问题 输出数字意味着什么

输出数字是指根据字符集的字符值,通常也基于某些大型机使用

C11 n1570,§5.2.1字符集 应定义两组字符及其相关的排序顺序:中的 哪些源文件写入源字符集,以及在 执行环境-执行字符集。每组又分为一组 基本字符集,其内容由本子条款给出,以及一个零或多个字符集 特定于语言环境的成员,这些成员不是名为 扩展字符。组合集也称为扩展字符集。这个 执行字符集成员的值由实现定义

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

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

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

当您在键盘上键入字符“1”时,标准输入流stdin实际上会收到两个字符:“1”和“\n”,因为您正在按以验证输入

因此,在完成getchar调用后,应该清理标准输入流。一种可能的实现方法是使用每个字符,直到达到换行符或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,值为负值[…]

输出数字意味着什么

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

2:[…太长,无法引用…]

10是换行符“\n”的ASCII和Unicode字符代码。因为您按Enter getchar键等待它!,您将获得发送到终端的Enter字符

输出数字意味着什么

getchar字符的字符代码返回,因为您得到了一个,并且正在使用%d说明符打印它。在本例中,您的字符编码似乎是ASCII或UTF-8,因此1代表49,2代表50,以此类推

2:[…太长,无法引用…]

10是换行符“\n”的ASCII和Unicode字符代码。因为您按Enter getchar键等待它!,您将获得发送到终端的Enter字符

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
#include <stdio.h>

int c;

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