我正在阅读K&R的The C Programming Language,并对putchar和getchar感到困惑 . 我制作了一个程序,你输入10个字符,程序将它们打印回屏幕 .
#include <stdio.h>
int main()
{
int i;
int ch;
for(i = 0; i < 10; i++)
{
printf("Enter a single character >> ");
ch = getchar();
putchar(ch);
}
return 0;
}
我希望得到这样的输出:
Enter a single character >> a
a
Enter a single character >> b
b
...等等10次,但这是我得到的输出:(进入2个字符后我停止了)
Enter a single character >> a
aEnter a single character >>
Enter a single character >> b
bEnter a single character >>
Enter a single character >>
不确定为什么我的输入字符与固定字符串组合并被输出 .
另外,我不太清楚为什么使用int来存储字符 .
6 回答
只打印单个字符,以下
printf
在同一行内继续 . 只需添加:在
putchar(ch);
之后,它将在printf
执行之前显式启动新行 . 此外,您还应该从输入字符后的输入中获取'\n'
:您没有打印新行 . 在
putchar(ch);
之后,您应该使用putchar('\n');
来打印新行 .用户终端可以在规范和非规范模式下操作 . 默认情况下,它以规范模式运行,这意味着标准输入可逐行(不是符号逐行)地用于程序 . 有问题的用户输入一些东西(让它是字母'a',十六进制为0x61)并按下输入(换行符中的新行字符'0x0A') . Ascii表是here . 因此,此操作为程序提供了两个符号 . 正如man getchar()中提到的那样,逐个符号地读取它 . 因此循环对一个字符迭代两次 . 要查看发生了什么,请使用以下程序(循环计数器输出,字符代码输出):
输出:
所以程序得到两个符号并打印出来 . 并且新的线符号不可见 . 所以在问题用户看到一个奇怪的额外线 . 有关不同终端模式以及如何进行调整的详细说明,请参见here .
使用终端选项时stty实用程序也很有用("icanon"告诉终端是否使用规范模式) .
关于在getchar()输出中将字符存储为int - 请参阅我的answer以获取类似主题 .
循环在偶数个时间,
getchar()
没有从键盘输入,但是它取自之前输入的命中,所以你也会注意到循环只执行了5次 . 因此,您必须清除缓冲区,即按下输入,以便可以在ch
中输入新字符 .不确定是否理想,但这有效:
我是初学者 . 我尝试了这个版本的代码,它给出了所需的输出 .