| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1303 人关注过本帖
标题:一个很诡异的问题
只看楼主 加入收藏
tanlinghang
Rank: 1
来 自:四川大学
等 级:新手上路
帖 子:21
专家分:0
注 册:2008-11-1
结帖率:100%
收藏
 问题点数:0 回复次数:11 
一个很诡异的问题
我写的是一个不能称作游戏的游戏:电脑随机产生数字,使用者输入0-99个数字猜测,电脑给予提示,直到猜中,然后询问是否再play一次。问题就出在这。代码如下:
#include <stdlib.h>
#include <stdio.h>
void main()
{
     int result,guess;
     char again;
     game:  srand(time(NULL));
            result=rand()%100;
            play: printf("Please input a number which you think is lucky(0-99):");
                  scanf("%d",&guess);
                  if(guess<result)
                  {
                         printf("Your number is small.Please try again.\n");
                             goto play;
                  }
                  else if(guess>result)
                  {
                         printf("Your number is large.Please try again.\n");
                         goto play;
                     }
                  else
                  {
                         printf("You are right.Congratulations!\n");
                            printf("Do you want to play again?(Y or N):");
                         again=getchar();
                         again=getchar();
                         if(again=='Y')  goto game;
                     }
}
注意倒数第4 5排,用了2行again=getchar(); 而程序只执行了1行,更诡异的是,如果只写一行again=getchar(); 程序就直接跳过 然后级结束了;更更诡异的是,如果不是验证输入  Y 或 N  而是 1 或 0的话  用scanf("%d",&again); 的话 (当然 变量申明again 为 int型)  只需要一行,程序就能够顺利的进行···各位前辈,各位同辈···这是为什么捏··   (getchar()用scanf("%c",&again);代替有同样的问题)
搜索更多相关主题的帖子: 游戏 include number result 
2008-11-16 23:22
lovemimi
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-10-12
收藏
得分:0 
你把最后那个else语句改为以下

printf("You are right.Congratulations!\n");
getchar();接受printf中的回车
printf("Do you want to play again?(Y or N):");
again=getchar();
getchar();

if(again=='Y')  goto game;

至于你说1和0,你可以把它看成字符在试试,都是一样的
2008-11-16 23:39
tanlinghang
Rank: 1
来 自:四川大学
等 级:新手上路
帖 子:21
专家分:0
注 册:2008-11-1
收藏
得分:0 
寝室12点要断网了 先感谢2楼了来 再学习·····

Only by standing on the shoulder of the giant can I see farther and farther.
2008-11-16 23:58
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
建议直接scanf(" %c", &again);,如果你怕麻烦的话……
2008-11-17 00:35
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
学习C就得想清楚啥叫输入缓冲区,哪些函数使用缓冲区,它们怎么使用缓冲区。

负担挺大的,要有思想准备哦

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-11-17 11:14
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
其实可以不用想清楚的,如果你想去做单片机混饭吃的话。

在老板的威压和编译器的胁迫下,你总会明白的。
2008-11-17 11:17
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
如果真的想不清楚的话,那就只好去做公务员了。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-11-17 11:50
danielxu
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2008-10-30
收藏
得分:0 
回复 6# 的帖子
比较有负担,能给详细讲讲么?
2008-11-17 12:35
wrn_hbu
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-11-13
收藏
得分:0 
这是一个典型的缓存中的回车符被误读的错误。
键盘键入的信息首先进入缓存,在键入回车\n后由缓存发送。
scanf不会读取控制字符,但getchar()会一并接受。
gethar将缓存中残留字符当作对前面的否定所以直接跳过。
可以在使用scanf之前清理缓存,flushall()。
改用如下代码:
while(gtechar()!=y)
{
   printf("..........");
   while(getchar()!='n')
        continue;     //接收缓存中剩余字符
}
2008-11-18 08:37
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
楼上的说法有两个漏洞……
2008-11-18 08:40
快速回复:一个很诡异的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018363 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved