我已经使用fflush清空缓存区了为什么还是有数字呢?

jingxingxiaozhang 2016-11-06 09:15:20
#include <stdio.h>
#include <stdlib.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);
for (int i = 0; i < count; i++)
{
printf("%d", rand() % 10);
}
//3.短暂延迟后,消除数字
remove_digit();
//4.输入数字,判断对错
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!");
fflush(stdin); //我已经在这里将缓存清空了,下一次读取输入的时候是需要我按键才有输入的。
} while (2); //但是我一个数字一个数字最后一个数字输入完毕按回车后,提示正确,然后直接出下一个数字串然后
//提示错误
return 0;
}

我在输入前和后都已经加了fflush(stdin),但是只要一次输入错误后面,及时输入正确也提示错误。肯定是有遗留字符,但是看不出是哪里有问题。帮忙看看哪里有问题
...全文
263 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
振翅高飞 2016-11-07
  • 打赏
  • 举报
回复
你调试过吗?没调试过就不要妄下结论。,你在第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;
}

paschen 2016-11-07
  • 打赏
  • 举报
回复
fflush不一定所有平台有效 试下用这种方式清空: while ( (c = getchar()) != '\n' && c != EOF ) ;
northwesternwind 2016-11-07
  • 打赏
  • 举报
回复
再加一个getchar()试试嘛。因为回车是0d,0a
jingxingxiaozhang 2016-11-07
  • 打赏
  • 举报
回复
引用 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); 但是还是一错就在输入正确也是显示是错误。
振翅高飞 2016-11-07
  • 打赏
  • 举报
回复
忘了提醒楼主,把上面我改造的代码的下面这句注释打开。我测试时为了方便注释掉的。忘了打开注释了,你把它打开。另外程序需要调试才能知道错误原因而不是靠主观猜想臆测。 //remove_digit();
振翅高飞 2016-11-07
  • 打赏
  • 举报
回复
改造后的代码,测试通过。

#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;
}
振翅高飞 2016-11-07
  • 打赏
  • 举报
回复
楼主犯了刻舟求剑的错误。 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数值结果。这是不正确的。
jingxingxiaozhang 2016-11-07
  • 打赏
  • 举报
回复
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的赋值上。
振翅高飞 2016-11-07
  • 打赏
  • 举报
回复
说错了是在第55行的那个for循环里面一开始加一个语句printf("\n输入前rand() % 10=%u\n",rand() % 10);然后单步调试,查看每一次的显示,除了第一次是你预期的数值外,其余都不是。 写程序是胆大心细,灵巧的事情。 但是归根结底解决一切困难的方法就是两个字儿: 认真 认真 认真
jingxingxiaozhang 2016-11-06
  • 打赏
  • 举报
回复
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!。帮忙在看看。
jingxingxiaozhang 2016-11-06
  • 打赏
  • 举报
回复
引用 1 楼 northwesternwind 的回复:
回车是两个字符,你fflush(stdin)不会清理输入,这是你对fflush误解了。 这样改改试试:

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

scanf_s("%u\n",&number);

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧