回 帖 发 新 帖 刷新版面

主题:不知为什么

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int m,n;
  char s='g';
  srand((int)time(0));
  while(1){
  scanf("%c",&s);
  m=rand()%6+1;
  
  n=rand()%6+1;
  printf("the number of computer is%d\n",m);
  
  
  printf("you number is%d\n",n);
  if(n<m) printf("so you lost the game!\n");
  else printf("so you won the game!\n");
  printf("\n\n\n");}
  system("PAUSE");    
  return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int m,n;
  char s='g';
  srand((int)time(0));
  while(1){
  scanf("%c",&s);
  m=rand()%6+1;
  
  n=rand()%6+1;
  printf("the number of computer is%d\n",m);
  
  
  printf("you number is%d\n",n);
  if(n<m) printf("so you lost the game!\n");
  else printf("so you won the game!\n");
  printf("\n\n\n");}
  system("PAUSE");    
  return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int m,n;
  char s='g';
  srand((int)time(0));
  while(1){
  scanf("%c",&s);
  m=rand()%6+1;
  
  n=rand()%6+1;
  printf("the number of computer is%d\n",m);
  
  
  printf("you number is%d\n",n);
  if(n<m) printf("so you lost the game!\n");
  else printf("so you won the game!\n");
  printf("\n\n\n");}
  system("PAUSE");    
  return 0;
}
不知为什么 总是出来两个结果?

回复列表 (共10个回复)

沙发

楼主需要了解一下scanf的相关知识。
scanf默认情况下是以“行”为单位的。也就是说,一旦调用了scanf函数,必须要遇到换行,才会返回,然后程序才继续执行(当然,遇到错误、遇到输入结束,scanf也会返回,但我们暂时不讨论这个)。
如果程序执行到scanf("%c",&s);,此时你输入a,然后按回车键,实际上输入了两个字符。第一个是字符a,第二个是换行符。这样一来,程序就会循环两次。如果你输入ab,然后按回车键,则实际上输入了三个字符。第一个是a,第二个是b,第三个是换行符。这样一来,程序就会循环三次。

板凳

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
    int m,n;
    char s='g';
    srand((int)time(0));
    while(1)
    {
        scanf("%c",&s);
        fflush(stdin);
        m=rand()%6+1;
        
        n=rand()%6+1;
        printf("the number of computer is%d\n",m);
        
        
        printf("you number is%d\n",n);
        if(n<m) printf("so you lost the game!\n");
        else printf("so you won the game!\n");
        printf("\n\n\n");
    }
    system("PAUSE");    
    return 0;
}
//不知道楼主用的是什么编译器,没写#include <time.h>头文件没有报错?
fflush(stdin);清空缓冲区,这样就好了。
scanf用法,专家级人物已经回答了。我也受益了。

3 楼

fflush(stdin);
不要这样用。很多书、很多人都指出,这个用法是不对的。cfj469933485可以看看这方面的资料。参考链接:[url=http://stdcpp.cn/html/3/3/0510/6.htm]http://stdcpp.cn/html/3/3/0510/6.htm[/url]

4 楼

感谢大哥的指教。

5 楼

谢谢两位,我没学过,3楼的http://stdcpp.cn/html/3/3/0510/6.htm我也看不懂啊!大概是太菜了。我们老师怎么没提呢?eastcowboy大哥能具体讲讲不?

6 楼

先不要管老师提没提。知道有问题,就多想想,总不会有什么害处。一味的跟着老师的脚步,那也是不好的。

fflush这个函数,要从缓冲说起。C语言的输入和输出,都是有“缓冲”这个的。

举个简单的例子,你要吃饭,饭在锅里,你当然不会每一口饭都从锅里去吃。正确的做法是,把锅里的饭盛到碗里,然后再一口一口的吃。这里的“饭”就相当于程序所需要的输入,“碗”就相当于缓冲。
假设你只需要吃一口饭,但是别人帮你盛饭时,盛了很多,哈哈,你吃不完了,怎么办?简单的办法就是直接倒掉(我不是叫楼主浪费粮食,呃),还有一个比较恶心的办法:咬一口,发现已经不需要吃了,吐掉,重复这个过程,直到碗里没有饭为止。

程序也是类似的。
你要用户从键盘输入一个字符,也就是scanf("%c", &s);这相当于你想吃一口饭,但是你不会每一口饭都去锅里吃。聪明的你知道要先把饭装在碗里,而聪明的C语言也知道要先把用户的键盘输入放到缓冲区里。这时候问题来了,你明明只需要一个字符,但是用户输入了两个字符(一个字符,外加一个回车)。那么你该怎么办?
我们知道用户输入的两个字符(或者更多的字符)中,只有第一个是有用的,剩下的所有字符都应该被丢弃。这时我们想到刚才那个比较恶心的例子:你是把整碗饭都一次性倒掉呢,还是用那个恶心的办法,吃一口再吐一口,直到没有饭为止? 

cfj469933485在2楼说,使用fflush(stdin);,就可以清除输入缓冲区(也就是把整碗饭都倒掉)。这个说法并非没有根据,至少,在Visual C++系列编译器中,这样做确实可以达到目的。遗憾的是,Visual C++并不能完完整整地代表C语言。在这个世界上还存在很多其它的编译器、开发环境,而且,有些开发环境中,使用fflush(stdin);可能导致程序的崩溃。所以,http://stdcpp.cn/html/3/3/0510/6.htm这里作者才会苦口婆心的告诉大家,不要用fflush(stdin);。如果我们希望让碗里面没有饭,即使是吃一口再吐一口,即使这样恶心,也不能把整碗饭一次性倒掉。因为,只有Visual C++和某些个别的编译器中,才能把整碗饭一次性倒掉,而在其它编译器中,这个动作的结果可能是把碗打破,然后大家都没得玩。

当然了,fflush这个函数本身还是有它的用武之地的。假设你不是输入而是输出,那就可以放心的使用fflush了。输出时,你不是在吃饭,而是在倒垃圾。输出的缓冲区就相当于你的垃圾桶,你可以随时用fflush去清空它。

结论很简单,fflush这个函数只能对输出的流有用。比如你可以写fflush(stdout); fflush(stderr);,但不能写fflush(stdin);

7 楼

感谢eastcowboy,让新手的我又受益匪浅了。以后我得注意fflush了,呵呵!

8 楼

学习了!

9 楼

fflush这个函数我在覃浩强的书上没找到,在哪里可找到象这些函数的详细介绍呢?

10 楼

可以百度一下。
C语言参考手册
我从图书馆借了,我根本就没看。
我也只是熟悉个别常用的函数。呵呵

我来回复

您尚未登录,请登录后再回复。点此登录或注册