user-0 提问: 我已经使用fflush清空缓存区了为什么还是有数字呢？

回复:
user: user-1
content: 你调试过吗？没调试过就不要妄下结论。，你在第100行的那个for循环里面一开始加一个语句 printf("\n输入前rand() % 10=%u\n",rand() % 10); 也就是在scanf_s("%u",&number);之前加。 然后单步调试，你看看，在输入正确的情况下，除了第一次打印出来的rand() % 10是你输入的值外，其余都不是。  我告诉你改的方法：   fflush(stdin);//这句放在scanf调用之前，紧跟scanf。 scanf_s("%u",&number);  我给你改过的代码如下，用VS2010测试通过。我之前回复的测试通过代码也是可以实现你的预期的。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ceng 1000 //记忆游戏，在屏幕上将一串数字显示很短的时间。玩家必须在数字消失之前记住他们，然后输入这串数字。每次过关后，计算机显示更长数字，最后打分  void kai_tou(void)   //游戏开始介绍 { printf("记忆游戏\n"); printf("游戏开始后，会出现一串数字，请记住数字，数字会在2秒后删除，然后请输出你记忆的数字，答对得分，答错不得分。\n每一关一共4次机会，答对3次晋级，答错2次及以上失败，结束。\n按0结束游戏\n");  printf("游戏开始！\n"); } //短暂延迟后，消除一行数字 void remove_digit(void) { time_t start_time = 0;  start_time = clock(); for (; clock() - start_time < CLOCKS_PER_SEC * 2;); printf("\r                              \n"); } int main(void) { int i = 100; unsigned int number = 0; unsigned long long  shu = 0ll;   //用来打印出来随机数字， int count = 6;          //显示在第几级游戏 int cishu = 0; bool correct = true;     time_t time_zhongzi = 0;   //开始介绍提示，先生成随机数字，打印出来，然后在消除，然后输入数字，判断对错，记录分数，继续循环，结束，给出得分 //1.开始介绍，提示 kai_tou();  do { //2.生成随机数字.这个是个循环开始 time_zhongzi = time(NULL); srand(time_zhongzi); for (int i = 0; i < count; i++) { printf("%d", rand() % 10); } //3.短暂延迟后，消除数字 remove_digit(); //4.输入数字，判断对错 srand(time_zhongzi);                //输入的种子是一样的，srand。rand之后得到的随机数一样 for (int i = 0; i < count; i++) { 	int v  = rand() % 10; 	printf("\n输入前rand() % 10=%u\n",v); 	fflush(stdin);//在这里是关键关键，说上3遍 scanf_s("%u",&number);  if (number != v) { correct = false; break; } else cishu++; } printf("%s\n", correct ? "correct!" : "wrong!"); } while (2); return 0; }

user: user-2
content: fflush不一定所有平台有效  试下用这种方式清空：  while ( (c = getchar()) != '\n' && c != EOF ) ;

user: user-3
content: 再加一个getchar()试试嘛。因为回车是0d,0a

user: user-0
content: 引用 6 楼 sunyongliang118 的回复:楼主犯了刻舟求剑的错误。 for (int i = 0; i < count; i++) { printf("%d", rand() % 10); } 上面程序段是为了显示计算机输出的随机数，假设是675902，而这个数字的由来是rand() % 10一个一个余数堆积的，注意此值对应的时间是此刻的。而时间是不会静止的，随机种子在变化。  然后发生了刻舟求剑的一幕。 注意程序运行到下面这句时，rand() % 10取余数和你输入的number 是随机关系，这里的rand() % 10并不是你上面输入的rand() % 10，懂吗？随机种子是随着时间衍生发展而变化的。所以这个逻辑判断为假的概率是大大的。你输入正确那一次只不过是凑巧了。 if (number != rand() % 10) { correct = false; break; } else cishu++; }  其次你找原因非要从fflush(stdin); 找，这个出发点就是错的。你根本没理解随机数种子和时间的对应关系，静止的看待rand() % 10数值结果。这是不正确的。 这个我测试过的，前后的rand值是一样的数组，给srand一个固定值，得出的种子是一样的，rand之后的多次随机数，一系列数字，是一样的。我在函数当中加了一句 time_zhongzi = time(NULL); 把这个种子给第一个，和第二个的srand，rand得出的一系列数是一样的，这个想法是对的。这个方法我是在书上看的。 当然正因为我确定是一样的，所以我才把出问题的地方集中在输入缓存上。 我用了 char c; while ((c = getchar()) != '\n' && c != EOF); 但是还是一错就在输入正确也是显示是错误。

user: user-1
content: 忘了提醒楼主，把上面我改造的代码的下面这句注释打开。我测试时为了方便注释掉的。忘了打开注释了，你把它打开。另外程序需要调试才能知道错误原因而不是靠主观猜想臆测。 //remove_digit();

user: user-1
content: 改造后的代码，测试通过。  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> //#include <stdbool.h> #define ceng 1000 //记忆游戏，在屏幕上将一串数字显示很短的时间。玩家必须在数字消失之前记住他们，然后输入这串数字。每次过关后，计算机显示更长数字，最后打分  void kai_tou(void)   //游戏开始介绍 { printf("记忆游戏\n"); printf("游戏开始后，会出现一串数字，请记住数字，数字会在2秒后删除，然后请输出你记忆的数字，答对得分，答错不得分。\n每一关一共4次机会，答对3次晋级，答错2次及以上失败，结束。\n按0结束游戏\n");  printf("游戏开始！\n"); } //短暂延迟后，消除一行数字 void remove_digit(void) { time_t start_time = 0;  start_time = clock(); for (; clock() - start_time < CLOCKS_PER_SEC * 2;); printf("\r                              \n"); } int main(void) { int i = 100; unsigned int number = 0; unsigned long long  shu = 0ll;   //用来打印出来随机数字， int count = 6;          //显示在第几级游戏 int cishu = 0; bool correct = true;     time_t time_zhongzi = 0;   //开始介绍提示，先生成随机数字，打印出来，然后在消除，然后输入数字，判断对错，记录分数，继续循环，结束，给出得分 //1.开始介绍，提示 kai_tou();  do { //2.生成随机数字.这个是个循环开始 time_zhongzi = time(NULL); srand(time_zhongzi); char cTmp[5]; char* strRecord = new char[count+1]; int Temp; for (int i = 0; i < count; i++) { 	Temp = rand() % 10; 	printf("%d", Temp); 	sprintf(cTmp,"%d",Temp); 	if(i == 0) 	{ 		strcpy(strRecord,cTmp); 	} 	else 	{ 		strcat(strRecord,cTmp); 	} }  printf("\n"); //3.短暂延迟后，消除数字 //remove_digit(); //4.输入数字，判断对错 srand(time_zhongzi);                //输入的种子是一样的，srand。rand之后得到的随机数一样 fflush(stdin); for (int i = 0; i < count; i++) { scanf_s("%u",&number); if (number != ((int)strRecord[i])-48) { correct = false; break; } else cishu++; } printf("%s\n", correct ? "correct!" : "wrong!"); delete [] strRecord; } while (2);                                                                                      return 0; }

user: user-1
content: 楼主犯了刻舟求剑的错误。 for (int i = 0; i < count; i++) { printf("%d", rand() % 10); } 上面程序段是为了显示计算机输出的随机数，假设是675902，而这个数字的由来是rand() % 10一个一个余数堆积的，注意此值对应的时间是此刻的。而时间是不会静止的，随机种子在变化。  然后发生了刻舟求剑的一幕。 注意程序运行到下面这句时，rand() % 10取余数和你输入的number 是随机关系，这里的rand() % 10并不是你上面输入的rand() % 10，懂吗？随机种子是随着时间衍生发展而变化的。所以这个逻辑判断为假的概率是大大的。你输入正确那一次只不过是凑巧了。 if (number != rand() % 10) { correct = false; break; } else cishu++; }  其次你找原因非要从fflush(stdin); 找，这个出发点就是错的。你根本没理解随机数种子和时间的对应关系，静止的看待rand() % 10数值结果。这是不正确的。

user: user-0
content: include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #include <ctype.h> #define ceng 1000 //记忆游戏，在屏幕上将一串数字显示很短的时间。玩家必须在数字消失之前记住他们，然后输入这串数字。每次过关后，计算机显示更长数字，最后打分  void kai_tou(void)   //游戏开始介绍 { 	printf("记忆游戏\n"); 	printf("游戏开始后，会出现一串数字，请记住数字，数字会在2秒后删除，然后请输出你记忆的数字，答对得分，答错不得分。\n每一关一共4次机会，答对3次晋级，答错2次及以上失败，结束。\n按0结束游戏\n");  	printf("游戏开始！\n"); } //短暂延迟后，消除一行数字 void remove_digit(void) { 	time_t start_time = 0; 	 	start_time = clock(); 	for (; clock() - start_time < CLOCKS_PER_SEC * 2;); 	printf("\r                                    \n"); } long long creat_digit(int count) { 	long long digit = 0ll; 	char* p = NULL; 	int i = 0; 	p = (char*)malloc(sizeof(char)*count + 1); 	srand(time(NULL)); 	for (; i < count; i++) 	{ 		int j = rand() % 10; 		p[i] = j+48; 	} 	p[i] = '\0'; 	digit = atoll(p); 	free(p); 	p = NULL; 	 	return digit; } int main(void) { 	int i = 100; 	 long long number = 0; 	 long long  shu = 0ll;   //用来打印出来随机数字， 	int count = 6;          //显示在第几级游戏 	int cishu = 0;          //用来记录答对几次 	int jilu_cuowu = 0;           //用来记录答错几次题 	bool correct = true;     time_t time_zhongzi = 0; 	char again = 'Y';  	//开始介绍提示，先生成随机数字，打印出来，然后在消除，然后输入数字，判断对错，记录分数，继续循环，结束，给出得分 	//1.开始介绍，提示 	kai_tou(); 	do 	{ 		jilu_cuowu = 0; 		printf("第%d关\n", count / 3 - 1); 		do 		{ 			//2.生成随机数字.这个是个循环开始 			shu = creat_digit(count); 			printf("%lld", shu); 			//3.短暂延迟后，消除数字 			remove_digit(); 			//4.输入数字，判断对错 			scanf_s("%lld", &number); 			if (number != shu) 			{ 				correct = false; 				jilu_cuowu++; 				if (jilu_cuowu == 2) 				{ 					printf("本关失败！\n"); 					count = 6; 					break; 				} 			} 			else 			{ 				correct = true; 				cishu++; 			} 			printf("%s\n", correct ? "correct!" : "wrong!"); 			//5.根据对错次数，增加层数 			if (cishu == 3) 			{ 				count = count+3; 				break; 			}  			char c; 			while ((c = getchar()) != '\n' && c != EOF); 		} while (2); 		printf("你是否还要继续玩？（请输入y or  n）\n"); 		char c; 		while ((c = getchar()) != '\n' && c != EOF); 		scanf_s("%c", &again,1);  	} while ((toupper(again) == 'Y')); 	return 0; } 我写好了，这是最后改好的，原来的问题就出在了correct的赋值上。

user: user-1
content: 说错了是在第55行的那个for循环里面一开始加一个语句printf("\n输入前rand() % 10=%u\n",rand() % 10);然后单步调试，查看每一次的显示，除了第一次是你预期的数值外，其余都不是。  写程序是胆大心细，灵巧的事情。  但是归根结底解决一切困难的方法就是两个字儿: 认真 认真 认真

user: user-0
content: srand(time_zhongzi);                //输入的种子是一样的，srand。rand之后得到的随机数一样 		fflush(stdin); 		for (int i = 0; i < count; i++) 		{ 			scanf_s("%u",&number); 			if (number != rand() % 10) 			{ 				correct = false; 				break; 			} 			else cishu++; 		} 		printf("%s\n", correct ? "correct!" : "wrong!"); 		getchar(); 即使我这样，也还是不行。输入完毕后，还是会立刻出现wrong！。帮忙在看看。

user: user-0
content: 引用 1 楼 user-3 的回复:回车是两个字符，你fflush(stdin)不会清理输入，这是你对fflush误解了。  这样改改试试：  scanf_s("%u\n",&number);   不行，按你这样改就运行不到下一步了。我跟你解释下，scanf函数是读取一个字符，然后和rand返回的一个字符比较。加\n之后就不行了。这个我觉得是有哪里忽略了，有多余字符留在缓存区上了，然后在下一个循环的时候被scanf读取了。

user: user-3
content: 回车是两个字符，你fflush(stdin)不会清理输入，这是你对fflush误解了。  这样改改试试：  scanf_s("%u\n",&number);