user-0 提问: c语言不解

回复:
user: user-1
content: 引用 9 楼 向阳森 的回复:[quote=引用 8 楼 赵4老师的回复:]可惜我原来发在#4楼的重复踩过无数次同一个坑的宝贵经验，被版主认为是灌水删掉了。 好在#7识货，实际试用效果展示了一小下。  emmm，我是新手，我也是刚弄CSDN，还不懂[/quote] 楼主的代码之所以出现问题，是因为在几个连续的输入输出间对缓冲区多余字符没处理好，建议去搜下scanf()printf()的详细用法，再结合上面的代码去感觉下。

user: user-0
content: 引用 8 楼 赵4老师的回复:可惜我原来发在#4楼的重复踩过无数次同一个坑的宝贵经验，被版主认为是灌水删掉了。 好在#7识货，实际试用效果展示了一小下。  emmm，我是新手，我也是刚弄CSDN，还不懂

user: user-2
content: 可惜我原来发在#4楼的重复踩过无数次同一个坑的宝贵经验，被版主认为是灌水删掉了。 好在#7识货，实际试用效果展示了一小下。

user: user-1
content: 引用 4 楼 赵4老师 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。 按赵老师的经验修改如下，供参考：#include <stdio.h> #define beet 2.05 #define artichokes 1.15 #define carrot   1.09   int main() { 	int i,k=0;         char s[2]; 	double total_price_goods, discount=0, freight_packingExpense, total_order_cost, beet_pound=0, artichokes_pound=0, carrot_pound=0; 	double total_price_beet, total_price_artichokes, total_price_carrots, a, b, c,total_pound; 	char ch; 	printf("ABC邮购杂货店订货系统\n"); 	printf("a)洋蓟        b）甜菜          c）胡萝卜       q)退出\n");  	while (1) 	{ 		if (k != 1) 			{printf("请输入你要购买货物的编号:");                         fflush(stdout);} 		else 			k = 0;                         rewind(stdin); 			scanf("%1s",s);//scanf_s("%c",&ch,1);                         ch = s[0]; 			switch (ch) 			{ 			case 'a': 				printf("请输入购买洋蓟的磅数：");                                 fflush(stdout);                                 rewind(stdin); 				scanf("%lf", &a);//scanf_s("%lf", &a); 				artichokes_pound += a; 				break; 			case 'b': 				printf("请输入购买甜菜的磅数：");                                 fflush(stdout);                                 rewind(stdin); 				scanf("%lf", &b);//scanf_s("%lf", &b); 				beet_pound += b; 				break; 			case 'c': 				printf("请输入购买胡萝卜的磅数：");                                 fflush(stdout);                                 rewind(stdin); 				scanf("%lf", &c);//scanf_s("%lf", &c); 				carrot_pound += c; 				break; 			case  'q': 				break; 			default : 				printf("请输入正确的编号：\n"); 				k = 1; 				//continue; 			} 			if (ch == 'q')  				break; 	    } 		total_price_artichokes = artichokes_pound * artichokes; 		total_price_beet = beet * beet_pound; 		total_price_carrots = carrot_pound * carrot; 		total_price_goods = total_price_artichokes + total_price_beet + total_price_carrots; 		if (total_price_goods >= 100) 			discount = total_price_goods * 0.05; 		total_pound = beet_pound + artichokes_pound + carrot_pound; 		if (total_pound ==0) 			freight_packingExpense = 0; 		else 		  if (total_pound <= 5) 			freight_packingExpense = 6.5; 		  else if (total_pound <= 20) 			freight_packingExpense = 14; 		  else 			freight_packingExpense = 14 + (total_pound - 20) * 0.5; 		total_order_cost = total_price_goods + freight_packingExpense - discount; 		for (i = 1;i <= 37;i++) 			printf("*"); 		printf("订单"); 		for (i = 1;i < 37;i++) 			printf("*"); 		printf("\n"); 		printf("物品种类     物品售价     订购重量（单位：磅）     物品费用\n"); 		printf(" a洋蓟        %.2f         %.2f                     %.2f            \n ",artichokes,artichokes_pound,total_price_artichokes); 		printf(" b甜菜        %.2f         %.2f                     %.2f             \n", beet, beet_pound, total_price_beet); 		printf(" c胡萝卜      %.2f         %.2f                     %.2f             \n", carrot, carrot_pound, total_price_carrots); 		printf("订单总费用：%.2f     折扣%.2f       运费和包装费%.2f       费用总额：%.2f        \n ",total_price_goods,discount,freight_packingExpense,total_order_cost);  			for (i = 1;i < 80;i++) 			printf("*"); 		printf("\n");  		return 0; } 运行效果：

user: user-3
content: 引用 5 楼 向阳森 的回复:[quote=引用 2 楼 一颗白面馒头的回复:]没有手动调试，scanf_s("%c",&ch,1);这句话第二次获取的输入应该是你输入时候的回车。建议打断点调试一下 还没学到打断点[/quote] 可以学着调试代码。因为你输入一个字符过后，你还敲了一个回车。这也是一个字符。所以第二次scanf_s的时候可能就是读取了回车这个字符。具体没调试也不敢肯定，但是既然又scanf_s了一次，你ch的值肯定是变了的

user: user-0
content: 引用 2 楼 一颗白面馒头的回复:没有手动调试，scanf_s("%c",&ch,1);这句话第二次获取的输入应该是你输入时候的回车。建议打断点调试一下 还没学到打断点

user: user-0
content: 引用 1 楼 一颗白面馒头的回复:其实这个问题理一下逻辑就出来了。从你输入10开始吧。 这时候的switch结构已经退出，然后if (ch == 'q')这句话不成立，所以while循环没有退出。又开始循环。因为你的k的值没有变过，所以执行了printf("请输入你要购买货物的编号:");这句话。scanf_s("%c",&ch,1);接下来这句话又获取了一个输入，此时ch的值肯定不是a, b, c了，所以进入了default：执行了printf("请输入正确的编号：\n");这句话。最后你输入了d，又是default的情况。 为什么此时的值肯定不是a.b.c

user: user-4
content: 在用%c获取有效输入之前，需要先仔细地把输入缓冲区打扫干净。一般用 while(getchar()!='\n'); 就行。

user: user-3
content: 没有手动调试，scanf_s("%c",&ch,1);这句话第二次获取的输入应该是你输入时候的回车。建议打断点调试一下

user: user-3
content: 其实这个问题理一下逻辑就出来了。从你输入10开始吧。 这时候的switch结构已经退出，然后if (ch == 'q')这句话不成立，所以while循环没有退出。又开始循环。因为你的k的值没有变过，所以执行了printf("请输入你要购买货物的编号:");这句话。scanf_s("%c",&ch,1);接下来这句话又获取了一个输入，此时ch的值肯定不是a, b, c了，所以进入了default：执行了printf("请输入正确的编号：\n");这句话。最后你输入了d，又是default的情况。