测试环境是VS2010,测试程序如下:
int _tmain(int argc, _TCHAR* argv[])
{
char a;
a = getchar();
FILE* temp = stdin;
/*断点*/system("pause");
return 0;
}
我们知道FILE的结构是:
struct _iobuf{
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef _iobuf FILE;
因此,请将断点设置在标记处,运行程序,直接回车,观察debug堆栈中temp的数据如下:
10 | 10 | 0 | 0 | .... |
转换成字符来看:
\n | \n | \0 | \0 | .... |
虽然我不知道为什么有两个\n(严重欢迎读者解答啊~), 但请问那些说将回车放入缓存的人从哪里看到的\r?
这个内存布局也可以完美解释
char a = getchar();
char b = getchar();
当直接点回车时需要两次回车,当a输入一个字符时则直接结束的问题。
欢迎不赞同的读者找板砖啊~~