【问题标题】:giving 2 outputs in while loop in c在 c 的 while 循环中给出 2 个输出
【发布时间】:2016-12-22 15:14:30
【问题描述】:

我试图编写一个代码来使用而不是使用 goto,我写了这个。 当我让这段代码运行时:

int main()
{
    int a;
    printf ("1 or 2");
    scanf ("%d", &a);
    if (a == 1)
    {
        return card();
    }
    else
        return computer();
}

int computer(void)
{
    char c;
    int f = 0 ;
    do
    {
        printf ("choose y or n\n");
        scanf ("%c", &c);

        switch (c)
        {
            case 'y':
                card();
                break;
            case 'n':
                main();
                break;
        }

    }
    while(f<1);

    return 0;
}
int card(void)
{
    char d;
    int e = 1;
    do
    {
        printf ("chhose y or n2\n");
        scanf ("%c", &d);

        switch (d)
        {
            case 'y':
                computer();
                break;
            case 'n':
                main();
                break;
        }
    }
    while(e<2);

    return 0;
}

它的输出是这样的:

1 or 2 2
choose y or n
choose y or n

第二次打印相同的东西。我尝试为不同的样式或算法更改 while 循环,但找不到有用的解决方案。我真的是编码新手,所以我真的没有想法

【问题讨论】:

  • 递归调用main 通常不是一个好主意。在main 函数中有一个主循环要好得多。
  • 至于你的问题。当您输入时,您使用回车键结束输入。此键作为换行符 ('\n') 存储在输入缓冲区中,当您在读取数字后读取字符时,您将获得此换行符。在 "%c" 之前的格式字符串中添加一个空格以丢弃换行符。
  • card 中调用main,从main 调用是一个隐藏的递归——小心,不要那样做。从main调用的函数应该使用return返回main
  • do while 循环 while(f&lt;1); 将无限运行,因为您没有递增 f
  • 一般注意事项:如果您希望用户回答单个问题并按回车,那么您应该阅读一行(如果您只能使用 C 标准库,则使用 fgets,或者更好 @ 987654336@ 如果它在您的操作系统中可用),然后解析它(可能使用sscanf,或者只是在for 循环中检查它)。 scanf 不适合基于行的输入。

标签: c while-loop do-while


【解决方案1】:

我自己的 %c 一直有问题。尝试执行以下操作

int computer(void)
{
   char c[3];
   int f = 0 ;
   do
   {
      printf ("choose y or n\n");
      scanf ("%s", c);

      switch (c[0])
      {
        case 'y':
            card();
            break;
        case 'n':
            main();
            break;
      }

   }while(f<1);

   return 0;
}

希望对你有帮助!!!

【讨论】:

    【解决方案2】:

    不良做法

    • 我可以看到“e”和“f”变量从未递增或分配任何其他值。所以,它是一个无限循环。
    • 递归调用 main() 是一种不好的做法

    burakozgul 已正确识别出实际问题。如果你只扫描一个字符,那就是你得到的,然后下一个 scanf() 调用将返回换行符或缓冲区中的任何字符!

    所以,我认为 User_Targaryen 使用 scanf(%s, &c) 的解决方案更好。但是,您可能想要使用 getchar() 函数。

    【讨论】:

      【解决方案3】:

      您也在阅读换行符。要忽略换行符,请将换行符读取到另一个字符。

      char c,ignore;
      scanf ("%c%c", &c,&ignore);
      

      这样。

      【讨论】:

      • ...当然,如果用户输入除单个字符后跟回车之外的任何内容,这将不起作用。
      • 这是一个例子,我没有处理错误情况:(@hyde
      • (我觉得有必要注意,这不是我的反对意见)
      • 最好用scanf("%c",&c);
      • @hyde 没问题 :) 我是新来的,如果大家能给出正确的方法。我也会学习的。
      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 2013-09-28
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 2012-11-06
      • 2018-08-18
      相关资源
      最近更新 更多