小问题:
do
{
menu();
printf("请选择>:\n");
rewind(stdin);
scanf("%d",&input);
switch(input)
{
case 1:
game();
input=0;
break;
case 2:
input=0;
break;
default:
printf("选择错误\n");
break;
}
}while(input);
在上面代码中,在switch中跳出一项用可以break;但是break只能跳出switch菜单,do while循环仍然继续,要跳出do while则需要在break之前加一句让while跳出的条件,
while(1)
{
printf("输入坐标:");
rewind(stdin); //防止scanf出错
scanf("%d %d",&x,&y);
x--;y--;
if(((x>=0)&&(x<=2))&&((y>=0)&&(y<=2)))
{
if(zone[x][y]==0)
{
zone[x][y]='*';
break;
}
else
{
printf("下标有误,请重新输入!\n");
}
}
else
{
printf("下标有误,重新输入!\n");
}
}
在这个里,scanf在第一次调用时正确,如果出错就会出现死循环,原因是scanf输入受到缓存区影响。
找到处理方法:
1、在每个最后不带\n的printf后面加fflush(stdout);(对标准输出流进行清理,但是它并不是把数据丢掉,而是及时地打印数据到屏幕上。)
2、在每个不想受到输入(接收)缓冲区旧内容影响的scanf();【或者getchar();或者gets_s();】前面加rewind(stdin);(rewind()函数的作用是把文件的当前位置指针指向文件头。)
或者添加fflush(stdin);(fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准])
rewind(stdin)清除键盘缓存区
stdin是标准输入,std是standard(标准),in是输入,指键盘输入到缓存区里的东西。