使用getchar()时的额外循环以及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将打印它,然后程序移动到下一个循环并等待我的下一个输入。但结果似乎表明代码并不像我想象的那样工作:
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)
;