user-0 提问: 大一学生求教。关于do..while..的问题。

回复:
user: user-1
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-2
content: 引用 7 楼 b372119132 的回复:[quote=引用 6 楼 maoshuoqiong 的回复:] [quote=引用 5 楼 b372119132 的回复:] [quote=引用 1 楼 maoshuoqiong 的回复:] #include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }  增加fflush函数.  请问我增加了这个函数之后 输入Y后第二次运行时 输出的数据是连同上一个数据一起显示的 这怎么回事 不是已经清空了吗 [/quote]  清空的只是系统输入缓冲区。 你的程序变量又没有被清零。 如果想不相同可以把变量改成循环局部变量，或者在每次循环的时候进行一次清零。 #include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流 		a = b = c = d =0; //变量清零  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }[/quote] 好的 努力学习[/quote] 加油，共勉

user: user-0
content: 引用 6 楼 maoshuoqiong 的回复:[quote=引用 5 楼 b372119132 的回复:] [quote=引用 1 楼 maoshuoqiong 的回复:] #include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }  增加fflush函数.  请问我增加了这个函数之后 输入Y后第二次运行时 输出的数据是连同上一个数据一起显示的 这怎么回事 不是已经清空了吗 [/quote]  清空的只是系统输入缓冲区。 你的程序变量又没有被清零。 如果想不相同可以把变量改成循环局部变量，或者在每次循环的时候进行一次清零。 #include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流 		a = b = c = d =0; //变量清零  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }[/quote] 好的 努力学习

user: user-2
content: 引用 5 楼 b372119132 的回复:[quote=引用 1 楼 maoshuoqiong 的回复:] #include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }  增加fflush函数.  请问我增加了这个函数之后 输入Y后第二次运行时 输出的数据是连同上一个数据一起显示的 这怎么回事 不是已经清空了吗 [/quote]  清空的只是系统输入缓冲区。 你的程序变量又没有被清零。 如果想不相同可以把变量改成循环局部变量，或者在每次循环的时候进行一次清零。 #include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流 		a = b = c = d =0; //变量清零  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }

user: user-0
content: 引用 1 楼 maoshuoqiong 的回复:#include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }  增加fflush函数.  请问我增加了这个函数之后 输入Y后第二次运行时 输出的数据是连同上一个数据一起显示的 这怎么回事 不是已经清空了吗

user: user-0
content: 引用 3 楼 user-3 的回复:因为第二次循环的时候getchar()的缓冲区里还有一个“\n” 一上来ch就直接等于“\n”了 所以导致直接就结束了 需要先用fflush(stdin); 清空缓冲区 就正常了 非常清楚 谢谢了！结了之后才看到 抱歉！

user: user-3
content: 因为第二次循环的时候getchar()的缓冲区里还有一个“\n” 一上来ch就直接等于“\n”了 所以导致直接就结束了 需要先用fflush(stdin); 清空缓冲区 就正常了

user: user-0
content: 引用 1 楼 maoshuoqiong 的回复:#include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }  增加fflush函数. 谢谢了！

user: user-2
content: #include <stdio.h>  int main() {  	int a = 0, b = 0, c = 0, d = 0;//a表示数字的个数，b表示字母的个数，c表示空格的个数，d表示其他的个数 	char ch,ch1;  	do 	{ 		printf("请输入一行字符：\n");  		while ((ch = getchar())!='\n') 		{ 			if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 				b++; 			else if(ch >= '0' && ch <= '9') 				a++; 			else if(ch == ' ')//一定注意是 == 而不是 = 				c++; 			else 				d++; 		} 		printf("该字符串共有\n%d个数字\n%d个字母\n%d个空格\n%d个其他字符\n是否需要继续输入?(Y/N):\n",a,b,c,d); 		scanf(" %c",&ch1); 		fflush(stdin); //清空输入流  	}while (ch1 == 'Y'||ch1 == 'y');  	return 0; }  增加fflush函数.