主题:不知为什么
_超.C
[专家分:10] 发布于 2010-11-28 21:42:00
#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个回复)
沙发
eastcowboy [专家分:25370] 发布于 2010-11-28 22:20:00
楼主需要了解一下scanf的相关知识。
scanf默认情况下是以“行”为单位的。也就是说,一旦调用了scanf函数,必须要遇到换行,才会返回,然后程序才继续执行(当然,遇到错误、遇到输入结束,scanf也会返回,但我们暂时不讨论这个)。
如果程序执行到scanf("%c",&s);,此时你输入a,然后按回车键,实际上输入了两个字符。第一个是字符a,第二个是换行符。这样一来,程序就会循环两次。如果你输入ab,然后按回车键,则实际上输入了三个字符。第一个是a,第二个是b,第三个是换行符。这样一来,程序就会循环三次。
板凳
cfj469933485 [专家分:950] 发布于 2010-11-28 22:47:00
#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 楼
eastcowboy [专家分:25370] 发布于 2010-11-28 22:51:00
fflush(stdin);
不要这样用。很多书、很多人都指出,这个用法是不对的。cfj469933485可以看看这方面的资料。参考链接:[url=http://stdcpp.cn/html/3/3/0510/6.htm]http://stdcpp.cn/html/3/3/0510/6.htm[/url]
5 楼
_超.C [专家分:10] 发布于 2010-11-29 19:54:00
谢谢两位,我没学过,3楼的http://stdcpp.cn/html/3/3/0510/6.htm我也看不懂啊!大概是太菜了。我们老师怎么没提呢?eastcowboy大哥能具体讲讲不?
6 楼
eastcowboy [专家分:25370] 发布于 2010-11-30 20:33:00
先不要管老师提没提。知道有问题,就多想想,总不会有什么害处。一味的跟着老师的脚步,那也是不好的。
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 楼
cfj469933485 [专家分:950] 发布于 2010-11-30 21:33:00
感谢eastcowboy,让新手的我又受益匪浅了。以后我得注意fflush了,呵呵!
8 楼
niufujun [专家分:50] 发布于 2010-12-01 14:14:00
学习了!
9 楼
_超.C [专家分:10] 发布于 2010-12-04 09:25:00
fflush这个函数我在覃浩强的书上没找到,在哪里可找到象这些函数的详细介绍呢?
10 楼
cfj469933485 [专家分:950] 发布于 2010-12-05 15:38:00
可以百度一下。
C语言参考手册
我从图书馆借了,我根本就没看。
我也只是熟悉个别常用的函数。呵呵
我来回复