【发布时间】:2014-12-04 10:06:25
【问题描述】:
我编写了一个 C 程序,它被认为是一个名为“刀石纸”的游戏。其中刀战胜了纸,石战胜了刀,纸战胜了石。我想通过提示用户在某些点输入 y(es) 或 n(o) 来使其用户友好。
但是,当我使用 scanf("%c",choice) 来存储用户的选择时,程序会表现得“有趣”或自动循环,但当我使用 getchar() 时可以完美运行。我想知道是不是这样。游戏代码如下。
要点是:
scanf("%c",&mainexit);
/*getchar();
mainexit=getchar();*/
和
scanf("%c",&exit);
/*getchar();
exit=getchar();*/
游戏:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char mainexit;
do
{
int choice;
char exit;
printf("Welcome To StoneKnifePaper!!!!! \n");
a:
printf("Pick One Option.(Enter integers)\n");
b:
printf(" 1.Stone. \n 2.Knife. \n 3.Paper. \n 4.Exit. \n GoodLuck! :) \n");
scanf("%d",&choice);
if(choice <1 || choice>4)
{
printf("Wrong Choice!!! Try Again. \n");
goto b;
}
else if ( choice == 4)
{
c:
printf("Are You Sure You Want To Quit? \n [y/n] \n");
scanf("%c",&exit);
/*getchar();
exit=getchar();*/
if (exit == 'Y' || exit == 'y')
{
return 0;
}
else if (exit == 'N' || exit == 'n')
{
goto a;
}
else if (exit != 'N' || exit!= 'n' || exit != 'Y' || exit != 'y')
{
printf("Wrong Entry. (Please Enter 'y' or 'n') \n");
goto c;
}
}
else if (choice >= 1 && choice <=3)
{
int randomnumber = rand()%3 +1;
if(choice==1 && randomnumber == 2)
{
printf("Congratulations!! Player has Won!! Stone Blunts Knife.");
}
else if(choice==2 && randomnumber == 3)
{
printf("Congratulations!! Player has Won!! Knife Cuts Paper.");
}
else if(choice==3 && randomnumber == 1)
{
printf("Congratulations!! Player has Won!! Paper wraps Stone.");
}
else if(choice==2 && randomnumber == 1)
{
printf("Computer has won!! Stone Blunts Knife.");
}
else if(choice==3 && randomnumber == 2)
{
printf("Computer has won!! Knife Cuts Paper.");
}
else if(choice==1 && randomnumber == 3)
{
printf("Computer has won!! Paper Wraps Stone.");
}
else if(choice == randomnumber)
{
printf("It's a draw!");
}
}
else
{
printf("Wrong Choice!!! Try Again. \n");
goto b;
}
printf("\n Play Game Again? Try Your luck. \n [y/n] ");
scanf("%c",&mainexit);
/*getchar();
mainexit=getchar();*/
}while(mainexit== 'Y'|| 'y');
return 0;
}
【问题讨论】:
-
放一个 getchar();在每次 scanf() 调用之后。 scanf() 在输入缓冲区(stdin)中留下一个 \n,然后由下一个 scanf()/getchar()/gets/"whatever reads from stdin" 读取
-
您将一个
scanf("%c", ...)呼叫与两个getchar呼叫进行比较? -
@mafso 不完全是。在我的代码中,我用 getchar() 注释了代码的 sn-ps。这意味着我正在使用 scanf()。运行它,它的运行方式与您注释 scanf() 部分并使用 getchar() 时的运行方式不同,所以我想知道为什么会这样。
-
每个
scanf("%c", ...)调用都有两个getchar调用被注释掉。如果你像这样两次调用scanf,你会得到几乎相同的行为。
标签: c