user-0 提问: 关于程序打印显示

回复:
user: user-1
content: 引用 9 楼 weixin_41374434 的回复:[quote=引用 4 楼 hou09tian 的回复:] 1 问题分析 输入q后直接直接退出的原因是 	printf("感谢使用本程序，再见。"); 	getchar(); 代码中，getchar()实际上读取了输入的q，即此时getchar()并没有停止，而是读取了输入流中的q，此时getchar()函数的返回值是q。 另外，你提到的代码中，需要输入2次q才能显示感谢词  主要原因是在temperatures()函数中也存在一个getchar()函数，所以需要输入2次q才能退出。 2 解决方法 正如楼上两位所说，先注释掉getchar()函数，可以考虑使用system()函数 #include "stdafx.h" #include<stdio.h> #include <stdlib.h>//-------------添加本头文件，包含system()函数  void temperatures(double huashi) { 	const double sheshi = 5.0 / 9.0 * (huashi - 32.0); 	const double k_s = 273.16; 	const double kaishi = sheshi + k_s;  	printf("华氏温度：%lf，摄氏温度：%lf，开氏温度：%lf\n" 		"请输入下一个您想要转换的华氏温度或者输入q以退出程序：\n" 		, huashi, sheshi, kaishi); 	//getchar(); }  int main() { 	double huashi = 0.0; 	printf("请输入您想要转换的华氏温度：\n"); 	while (scanf("%lf", &huashi) == 1) 	{ 		getchar(); 		temperatures(huashi); 	} 	printf("感谢使用本程序，再见。\n"); 	//getchar(); 	system("pause");//----------添加本行代码 	return 0; } 3 问题扩展 可以考虑用楼上朋友提到的，对输入的内容进行判断，如果是q才退出，其它的输入不退出。 请参考如下文章 《C++中getchar()的使用方法》 《C++控制台程序判断输入的数字》 希望能够帮到你  您好，很感谢您的帮助。惭愧的是，我还是没太明白，看您问题拓展里面给的关于getchar();的介绍，使用getchar();是旨在抽走缓冲区里面多余的回车符，于是我推理了一遍程序，去掉了temperature()里面的getchar(); ，可是程序还是没有在出现感谢词后暂停。不知道有没有什么办法在不使用system("pause")的情况下修正程序？  另外，在我使用system("pause");时，程序会出错且无法暂停，代码及错误提示如下： 代码： //#include "stdafx.h"        --     这行头文件会提示错误。 #include<stdio.h> #include <stdlib.h>//        -- 我添加的头文件  void temperatures (double huashi);  int main (void) { 	double huashi = 0.0; 	printf("请输入您想要转换的华氏温度：\n"); 	while (scanf("%lf", &huashi) == 1) 	{ 		getchar();//         --   留下的getchar(); 		temperatures(huashi); 	} 	printf("感谢使用本程序，再见。"); 	system ("pause"); 	//getchar();             --   注释掉的第一个getchar(); 	return 0; }  void temperatures (double huashi) { 	const double sheshi = 5.0 / 9.0 * (huashi - 32.0); 	const double k_s = 273.16; 	const double kaishi = sheshi + k_s;  	printf("华氏温度：%lf，摄氏温度：%lf，开氏温度：%lf\n" 				"请输入下一个您想要转换的华氏温度或者输入q以退出程序：\n" 				, huashi, sheshi, kaishi);  	//getchar();             --   注释掉的第二个getchar(); }    错误提示： /Users/william/OneDrive/coding/C/getchar/cmake-build-debug/getchar 请输入您想要转换的华氏温度： 12 华氏温度：12.000000，摄氏温度：-11.111111，开氏温度：262.048889 请输入下一个您想要转换的华氏温度或者输入q以退出程序： q sh: pause: command not found 感谢使用本程序，再见。 Process finished with exit code 0[/quote] 估计是我没有表达清除。getchar()函数每次读取一个字符，所以在你输入“q+回车”后，显示感谢信息的代码 printf("感谢使用本程序，再见。"); 之后，第一个getchar()函数读取的是q字符，第二个getchar()读取的是\n字符，如果你想让程序停留在显示感谢信息的窗口上，就必须再次调用getchar()函数，即要调用3次getchar() 	printf("感谢使用本程序，再见。\n"); 	getchar(); 	getchar(); 	getchar(); 此时的效果如图所示  对于你提到的 system("pause"); 无效的情况，我估计是编译环境不同。我用的是VS2015+Windows10，以下是运行效果

user: user-2
content: 这些人都瞎说什么，也不自己加断点看看程序什么问题  首先你要知道两点，1是getchar运行一次只从缓存里抽一个字节，2是getchar是有返回值的，你可以申明一个int x；x=getchar()；加断点看看每次getchar的是啥东西  然后你就会发现，只要你输入的不是数字，scanf("%lf", &huashi)就会执行失败，也是说while会跳出，同时huashi也是0，并没有进行赋值操作，然后再依次执行printf("感谢使用本程序，再见。"); getchar();这个getchar就是取了你输入的q，并不会暂停下来(你以为是后面的没有执行，但是你在return 0加个断点就可以看到printf执行了)，然后你再加一个getchar，依然没有暂停，因为你还输入了一个回车，getchar会返回ascii的10，然后你再加一个getchar，这时候就能暂停了，当然如果你输入的是quit或是其他什么字符串，有多少就要加多少getchar，知道取完

user: user-0
content: 引用 4 楼 hou09tian 的回复:1 问题分析 输入q后直接直接退出的原因是 	printf("感谢使用本程序，再见。"); 	getchar(); 代码中，getchar()实际上读取了输入的q，即此时getchar()并没有停止，而是读取了输入流中的q，此时getchar()函数的返回值是q。 另外，你提到的代码中，需要输入2次q才能显示感谢词  主要原因是在temperatures()函数中也存在一个getchar()函数，所以需要输入2次q才能退出。 2 解决方法 正如楼上两位所说，先注释掉getchar()函数，可以考虑使用system()函数 #include "stdafx.h" #include<stdio.h> #include <stdlib.h>//-------------添加本头文件，包含system()函数  void temperatures(double huashi) { 	const double sheshi = 5.0 / 9.0 * (huashi - 32.0); 	const double k_s = 273.16; 	const double kaishi = sheshi + k_s;  	printf("华氏温度：%lf，摄氏温度：%lf，开氏温度：%lf\n" 		"请输入下一个您想要转换的华氏温度或者输入q以退出程序：\n" 		, huashi, sheshi, kaishi); 	//getchar(); }  int main() { 	double huashi = 0.0; 	printf("请输入您想要转换的华氏温度：\n"); 	while (scanf("%lf", &huashi) == 1) 	{ 		getchar(); 		temperatures(huashi); 	} 	printf("感谢使用本程序，再见。\n"); 	//getchar(); 	system("pause");//----------添加本行代码 	return 0; } 3 问题扩展 可以考虑用楼上朋友提到的，对输入的内容进行判断，如果是q才退出，其它的输入不退出。 请参考如下文章 《C++中getchar()的使用方法》 《C++控制台程序判断输入的数字》 希望能够帮到你  您好，很感谢您的帮助。惭愧的是，我还是没太明白，看您问题拓展里面给的关于getchar();的介绍，使用getchar();是旨在抽走缓冲区里面多余的回车符，于是我推理了一遍程序，去掉了temperature()里面的getchar(); ，可是程序还是没有在出现感谢词后暂停。不知道有没有什么办法在不使用system("pause")的情况下修正程序？  另外，在我使用system("pause");时，程序会出错且无法暂停，代码及错误提示如下： 代码： //#include "stdafx.h"        --     这行头文件会提示错误。 #include<stdio.h> #include <stdlib.h>//        -- 我添加的头文件  void temperatures (double huashi);  int main (void) { 	double huashi = 0.0; 	printf("请输入您想要转换的华氏温度：\n"); 	while (scanf("%lf", &huashi) == 1) 	{ 		getchar();//         --   留下的getchar(); 		temperatures(huashi); 	} 	printf("感谢使用本程序，再见。"); 	system ("pause"); 	//getchar();             --   注释掉的第一个getchar(); 	return 0; }  void temperatures (double huashi) { 	const double sheshi = 5.0 / 9.0 * (huashi - 32.0); 	const double k_s = 273.16; 	const double kaishi = sheshi + k_s;  	printf("华氏温度：%lf，摄氏温度：%lf，开氏温度：%lf\n" 				"请输入下一个您想要转换的华氏温度或者输入q以退出程序：\n" 				, huashi, sheshi, kaishi);  	//getchar();             --   注释掉的第二个getchar(); }    错误提示： /Users/william/OneDrive/coding/C/getchar/cmake-build-debug/getchar 请输入您想要转换的华氏温度： 12 华氏温度：12.000000，摄氏温度：-11.111111，开氏温度：262.048889 请输入下一个您想要转换的华氏温度或者输入q以退出程序： q sh: pause: command not found 感谢使用本程序，再见。 Process finished with exit code 0

user: user-3
content: 你输入任意字符都会退出，因为你缓冲区已经没有数据了，而你又调用的getchar函数，它在等你的缓冲区有数据才退出getchar函数。去掉程序里任意一个getchar就可以了。因为输入都是有回车的，所以在缓冲区会残留一个 '\n' ,用一个getchar就相当于清除缓冲区（当然时你正确输入数据的情况下）。如果你输入的是      11abc    你试一下会怎么样呢？

user: user-1
content: 1 问题分析 输入q后直接直接退出的原因是 	printf("感谢使用本程序，再见。"); 	getchar(); 代码中，getchar()实际上读取了输入的q，即此时getchar()并没有停止，而是读取了输入流中的q，此时getchar()函数的返回值是q。 另外，你提到的代码中，需要输入2次q才能显示感谢词  主要原因是在temperatures()函数中也存在一个getchar()函数，所以需要输入2次q才能退出。 2 解决方法 正如楼上两位所说，先注释掉getchar()函数，可以考虑使用system()函数 #include "stdafx.h" #include<stdio.h> #include <stdlib.h>//-------------添加本头文件，包含system()函数  void temperatures(double huashi) { 	const double sheshi = 5.0 / 9.0 * (huashi - 32.0); 	const double k_s = 273.16; 	const double kaishi = sheshi + k_s;  	printf("华氏温度：%lf，摄氏温度：%lf，开氏温度：%lf\n" 		"请输入下一个您想要转换的华氏温度或者输入q以退出程序：\n" 		, huashi, sheshi, kaishi); 	//getchar(); }  int main() { 	double huashi = 0.0; 	printf("请输入您想要转换的华氏温度：\n"); 	while (scanf("%lf", &huashi) == 1) 	{ 		getchar(); 		temperatures(huashi); 	} 	printf("感谢使用本程序，再见。\n"); 	//getchar(); 	system("pause");//----------添加本行代码 	return 0; } 3 问题扩展 可以考虑用楼上朋友提到的，对输入的内容进行判断，如果是q才退出，其它的输入不退出。 请参考如下文章 《C++中getchar()的使用方法》 《C++控制台程序判断输入的数字》 希望能够帮到你

user: user-4
content: 哪里有对'q'做判断，退出循环呢？  建议去掉所有的getchar();语句，然后可以通过输入ctrl+d（Linux）或ctrl+z(windows)退出循环，注意退出条件是快捷键

user: user-5
content: 把temperatures函数中的getchar()注释掉就好了。不过你的程序，不仅仅是输入q会退出，只要输入的内容不是float类型的，都会退出，你是知道的，对吧void temperatures (double huashi) {     const double sheshi = 5.0 / 9.0 * (huashi - 32.0);     const double k_s = 273.16;     const double kaishi = sheshi + k_s;       printf("华氏温度：%lf，摄氏温度：%lf，开氏温度：%lf\n"                 "请输入下一个您想要转换的华氏温度或者输入q以退出程序：\n"                 , huashi, sheshi, kaishi);     //getchar(); }

user: user-6
content: 你的程序输入q并没有退出。推荐把while里的条件好好改改

user: user-0
content: 引用 2 楼 zangfong的回复:把temperatures函数中的getchar()注释掉就好了。不过你的程序，不仅仅是输入q会退出，只要输入的内容不是float类型的，都会退出，你是知道的，对吧void temperatures (double huashi) {     const double sheshi = 5.0 / 9.0 * (huashi - 32.0);     const double k_s = 273.16;     const double kaishi = sheshi + k_s;       printf("华氏温度：%lf，摄氏温度：%lf，开氏温度：%lf\n"                 "请输入下一个您想要转换的华氏温度或者输入q以退出程序：\n"                 , huashi, sheshi, kaishi);     //getchar(); } 对的对的，我知道的，只是q是quit缩写嘛，就作为代表字母说出来了。

user: user-7
content: 你的程序中没有对输入的字符进行判断呀，哪里体现出来你输入q是退出程序呢？你需要判断if((ch = getchar()) == 'q')然后调用你的退出的程序。

user: user-8
content: 输入合法性校验问题够程序员吃一辈子了。