【问题标题】:Difference between getchar() and scanf("%c",'name_of_variable')?getchar() 和 scanf("%c",'name_of_variable') 的区别?
【发布时间】: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


【解决方案1】:

scanf 获取输入但跳过前导空格字符,如空格、换行符空格等。 所以第一个输入之后的新行存储在缓冲区中,以便下一个 scanf 获取输入 那个。

所以避免这种情况,您可以在 scanf 控制字符串之前使用空格。赞这个scanf(" %c",&amp;exit);

【讨论】:

  • 谢谢。与上述 cmets 之一相同的解释。我尝试了 %c 之前的空间,它起作用了。那么这个空间有什么作用呢?
  • 空格被视为空白字符。所以在控制字符串匹配第一个空白字符之前给出它并忽略然后得到下一个字符是一个相应的输入。
  • 第二段和最后一条评论似乎与第一段相矛盾(这是错误的)。错字?
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2023-03-17
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多