user-0 提问: getchar的相关问题请教

回复:
user: user-1
content: 我的运行结果： Hi! What's your first name? bill<cr> bill, what's your weight in pounds? 1.1<cr> Well, bill, your volume is 0.02 cubic feet. Also, your first name has 4 letters, and we have 40 bytes to store it in. <cr> 程序结束

user: user-1
content: 就在刚才，我想到了怎样看“流”，就是用debugger（其实应该能早想到的） scanf("%f",&weight);之后，应该可以看到stdin的内部情况，get指针应该指向\n，表示\n还没有读取，下次读的时候，应该从此\n开始。

user: user-0
content: 引用 20 楼 ForestDB 的回复:我的运行结果： Hi! What's your first name? bill<cr> bill, what's your weight in pounds? 1.1<cr> Well, bill, your volume is 0.02 cubic feet. Also, your first name has 4 letters, and we have 40 bytes to store it in. <cr> 程序结束 我的运行结果和你一样啊，按照你9L的回复，  引用 22 楼 ForestDB 的回复:重新看我9L的回复。 我明白了，非常感谢哈！

user: user-1
content: 重新看我9L的回复。

user: user-0
content: 引用 20 楼 ForestDB 的回复:我的运行结果： Hi! What's your first name? bill<cr> bill, what's your weight in pounds? 1.1<cr> Well, bill, your volume is 0.02 cubic feet. Also, your first name has 4 letters, and we have 40 bytes to store it in. <cr> 程序结束 对啊，程序只有两个getchar却会停在那里啊，按道理不是两个getchar吃两个回车，应该还要有一个getchar来获取用户输入的回车，程序才退出啊

user: user-1
content: Hi! What's your first name? bill<cr> // scanf("%s", name); bill, what's your weight in pounds? 1.1<cr> // scanf("%f", &weight); getchar(); <cr> // getchar();  输入流为： bill<cr 1>1.1<cr 2><cr 3> scanf("%s", name);从流中提取bill，遇到<cr 1>停止，<cr 1>由于没有提取，仍在流中； scanf("%f", &weight);（略过<cr 1>，因为它不是float），提取1.1，遇到<cr 2>停止，<cr 2>没有提取，仍在流中； getchar();提取<cr 2>； getchar();提取<cr 3>； 程序结束。

user: user-0
content: 引用 7 楼 ForestDB 的回复:你所有的输入（字符），都会存在于流中； 所以回车这个字符，也会在流中； 而getchar也好，scanf也好，都是从流中提取字符（自然有可能提取到回车）；  回车之所以特殊，是因为流一般是行缓冲的，即只有碰到回车之后，才把缓冲中的字符，放入流中。 那为什么下面这张图只需要两个getchar就可以呢？按照原理两个getchar吃掉两个scanf的回车，还要再有一个getchar等待用户输入回车呀？但是实验中只需要两个getchar就行了，程序不会自动退出。

user: user-0
content: 引用 18 楼 ForestDB 的回复:有没有rebuild all？ 明天我试试吧 VS2010对吧 是2010，有重新生成啊！附代码如下： #include "stdafx.h" #include <string.h> #define DENSITY 62.4   int _tmain(int argc, _TCHAR* argv[]) { 	float weight,volume; 	int size,letters; 	char name[40];  	printf("Hi!What's your first name?\n"); 	scanf("%s",name); 	printf("%s,what's your weight in pounds?\n",name); 	scanf("%f",&weight); 	size=sizeof name; 	letters=strlen(name); 	volume=weight/DENSITY; 	printf("Well,%s,your volume is %2.2f cubic feet.\n", 		name,volume); 	printf("Also,your first name has %d letters,\n",letters); 	printf("and we have %d bytes to store it in.\n",size); 	getchar(); 	getchar(); 	return 0; }

user: user-1
content: 你所有的输入（字符），都会存在于流中； 所以回车这个字符，也会在流中； 而getchar也好，scanf也好，都是从流中提取字符（自然有可能提取到回车）；  回车之所以特殊，是因为流一般是行缓冲的，即只有碰到回车之后，才把缓冲中的字符，放入流中。

user: user-0
content: 引用 1 楼 max_min_ 的回复:因为每次scanf输入的时候都有一个回车符留在缓冲区里的 getchar其实是吃掉了每次输入的回车符，如果没有的话，下次scanf的话，就会先读上次一次输入的回车符了！ 那下次scanf读到上次输入的回车就直接退出了？

user: user-0
content: 引用 4 楼 ForestDB 的回复:注意理解“流”stream这个概念。 不太理解额，能否给我讲解一下“流”这个东西呢？

user: user-1
content: 有没有rebuild all？ 明天我试试吧 VS2010对吧

user: user-0
content: 引用 14 楼 ForestDB 的回复:你运行时有无press any key to continue之类的东西？ 没有啊，所以感到纳闷 如下图

user: user-0
content: 引用 13 楼 u011623102 的回复:你看仔细了，你改后明明有3个getchar。 那个没改清楚，你把scanf后面那个getchar代码去了，还是正常运行的。

user: user-2
content: 引用 1 楼 max_min_ 的回复:因为每次scanf输入的时候都有一个回车符留在缓冲区里的 getchar其实是吃掉了每次输入的回车符，如果没有的话，下次scanf的话，就会先读上次一次输入的回车符了！  正解。 你可以把scanf注释掉试试看。

user: user-1
content: 你运行时有无press any key to continue之类的东西？

user: user-3
content: 你看仔细了，你改后明明有3个getchar。

user: user-0
content: 引用 9 楼 ForestDB 的回复:Hi! What's your first name? bill<cr> // scanf("%s", name); bill, what's your weight in pounds? 1.1<cr> // scanf("%f", &weight); getchar(); <cr> // getchar();  输入流为： bill<cr 1>1.1<cr 2><cr 3> scanf("%s", name);从流中提取bill，遇到<cr 1>停止，<cr 1>由于没有提取，仍在流中； scanf("%f", &weight);（略过<cr 1>，因为它不是float），提取1.1，遇到<cr 2>停止，<cr 2>没有提取，仍在流中； getchar();提取<cr 2>； getchar();提取<cr 3>； 程序结束。 如果按照这样下来的话，程序结束后就会自动退出了，但是实际情况是还在等待用户输入回车，这是我困惑的地方。

user: user-4
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-5
content: 引用 2 楼 pokerLee 的回复:为什么你的主程序是int _tmain()呢? 因为用的是VS，默认就是这个！