/
//----------CODE1------------------------
int a[5] = {0,0,0,0,0};
int i = 0;
while((ch = getchar()) && i < 5)
{a[i] = ch;i++;}
for(int idx = 0; idx < 5; idx ++)
printf("%d ", a[idx]);
//连敲6下回车,退出循环,查看打印
//打印显示:10 10 10 10 10
//----------CODE2------------------------
char ch;
int a[5] = {0,0,0,0,0};
int i = 0;
while((ch = getch()) && i < 5)
{a[i] = ch;i++;}
for(int idx = 0; idx < 5; idx ++)
printf("%d ", a[idx]);
//连敲6下回车,退出循环,查看打印
//打印显示:13 13 13 13 13
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
回车 0x0d \r
换行 0x0a \n首先看上边两段代码
我们在写字板里输入 1回车2回车3回车4 ,然后用十六进制查看器打开查看,发现里边的实际内容是 31 0D 0A 32 0D 0A 33 0D 0A 34 ,可以发现回车键由0D 0A两个字符组成,并且是先0D后0A,下面引用一段CSDN论坛大神的回复:
"
Windows里回车输入的其实是\r\n,但是C库会对其进行处理(读写文本文件时也会),统一转换为规范的\n。而getch()则是比较低级的,会越过这个处理,貌似没有经过输入流缓冲,而是直接调用键盘服务中断获得的,就是原始按键。
"
那么,上述代码可以给出如下解释:
1.getchar收到的\r\n被C库同意转换为了\n, 也就是0x0a ;
2.getch没有进行处理,该函数收到键值,就马上返回,所以getch只是拿到先输入的0x0d就返回了,而0x0a就被抛弃了。
于是出现了上述情况。
以上分析为个人理解,如有差错,请指教~