在下一个代码中:
#include <stdio.h>
int main(void) {
int c;
while ((c=getchar())!= EOF)
putchar(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我必须按Enter下来打印我输入的所有字母getchar,但我不想这样做,我想要做的就是按下这封信,然后立即看到我重复介绍的信,而不是按下Enter.例如,如果我按下'a'字母,我想在旁边看到另一个'a',依此类推:
aabbccddeeff.....
Run Code Online (Sandbox Code Playgroud)
但当我按'a'时没有任何反应,我可以写其他字母,只有当我按下时才会出现副本Enter:
abcdef
abcdef
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我正在使用cc -o example example.cUbuntu下的命令进行编译.
一个相关的问题在这里,但我的问题是不同的.
但是,我想更多地了解getchar()和stdin的内部结构.我知道getchar()最终只调用fgetc(stdin).
我的问题是缓冲,stdin和getchar()行为.鉴于经典的K&R示例:
#include <stdio.h>
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,getchar()的行为可以描述如下:
如果stdin缓冲区中没有任何内容,请让OS接受用户输入,直到按下[enter].然后返回缓冲区中的第一个字符.
假设程序运行并且用户键入"凤尾鱼".
因此,在上面的代码清单中,第一次调用getchar()等待用户输入并将缓冲区中的第一个字符分配给变量c.在循环内部,第一次迭代对getchar()的调用说:"嘿,缓冲区中有东西,返回缓冲区中的下一个字符." 但是while循环的第N次迭代导致getchar()说"嘿,缓冲区中没有任何东西,所以让stdin收集用户键入的内容.
我花了一点时间使用c源代码,但似乎这更像是stdin而不是fgetc()的行为神器.
我错了吗?感谢您的见解.