【问题标题】:C Looping a switch using Y/N options. Choosing N doesn't close the programC 使用 Y/N 选项循环开关。选择 N 不会关闭程序
【发布时间】:2014-09-07 12:16:26
【问题描述】:

我才开始编写 C 代码。(这里是大一,没有经验,只有基本的 html) 出于某种原因,每当我选择选项“N”时,它只会创建一个新行。

在我的第二个scanf 中,每当我更改我的'%s' 时,结果都会发生变化。 当我使用"%d"时,输入一个数字后,它不断输入“Choose a number between 1-4”。如果我使用"%c",输入数字后会直接跳到循环。帮忙?

#include <stdio.h>
int main()
{
    int n, ok = 0;
    char input;
    while (ok == 0)
    {
          printf("Choose a number between 1-4\n");
          scanf("%d", &n);
          switch (n)
          {
                 case 1:
                      printf("You've chosen number 1");
                      break;
                 case 2:
                      printf("You've chosen number 2");
                      break;
                 case 3:
                      printf("You've chosen number 3");
                      break;
                 case 4:
                      printf("You've chosen number 4");
                      break;
                 default:
                         printf("You have chosen an invalid number");
          }
          printf("\nInput again? (Y/N)\n");
          scanf("%s", &input);
          if (input=='n'||input=='N')
          {ok++;}
          else if (input=='Y'||input=='y')
          {printf("\n");}


    }

 getchar();
 getchar();   
}

【问题讨论】:

  • 为什么没有iostreamstd::cin?它更易于使用。
  • scanf("%d" 不会从流中删除换行符(对应于您按 Enter 键的内容)。您随后的scanf 会阅读它。要检测到这一点,您可以检查scanf("%s" 的结果并检查您收到的内容(除了与 YyNn 进行比较之外)。为防止出现这种情况,您需要在成功输入%d 后丢弃该行的其余部分。
  • 与你的问题无关,但你的代码不是很优雅。如果要选择的数字在 1 到 100 之间,如何编写此代码?

标签: c++ c loops switch-statement case


【解决方案1】:

改变

scanf("%s", &input);

scanf(" %c", &input);

最后去掉getchar()s。它会按你的意愿工作。 %c 说明符读取一个 char 字符,但它不会省略空白字符。将空间放入 scanf 的格式将处理空格并读取第一个非空格字符。为了更清楚,请参阅手册页中有关 %c 格式说明符的内容:

(...) 通常跳过前导空白被抑制。跳过 首先是空格,在格式中使用显式空格。

但是,如果您真的在学习 C++,请坚持使用 cin/cout,而不是 scanf/printf。

如果您将 printf/scanf 替换为 cin/cout,您的程序将如下所示。如果您以前这样做过,就不会遇到这种麻烦。

#include <iostream>

using namespace std;

int main()
{
    int n, ok = 0;
    char input;
    while (!ok)
    {
        cout << "Choose a number between 1-4\n";
        cin >> n;

        switch (n)
        {
            case 1:
                cout << "You've chosen number 1";
                break;
            case 2:
                cout << "You've chosen number 2";
                break;
            case 3:
                cout << "You've chosen number 3";
                break;
            case 4:
                cout << "You've chosen number 4";
                break;
            default:
                cout << "You have chosen an invalid number";
        }
        cout << "\nInput again? (Y/N)\n";
        cin >> input;

        if (input=='n' || input=='N')
        {
            ok++;
        }
        else if (input=='Y' || input=='y')
        {
            cout << "\n";
        }
    }

    return 0;
}

【讨论】:

  • 那我们又要添加c++标签了吗?
  • 好吧,我真的不知道。我也认为这个问题是纯 C 的,但如果 OP 真的想学习 C++,那么他应该知道他发布的内容是纯 C。我展示了他如何使用 C++ 的 I/O 实现他想要的。
  • 它实际上没有用,使用%c,每当我输入数字时,它都会发布“你选择了数字'x',再次输入?(Y/N),选择一个1-4 之间的数字。”糟糕,废话,我们在做 C。但是,仍然感谢您的回答!
  • 如果它不起作用,请更清楚它应该如何工作。请记住,格式应该是" %c",而不是"%c"(注意百分号前的空格)。
  • @macfij 哎呀,没注意到它应该是' %c'。它终于奏效了。谢谢!还有一个问题,"%c"和`"%c"'有什么区别
猜你喜欢
  • 2018-07-13
  • 2013-08-18
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多