【问题标题】:C++ Char Loop CheckC++ 字符循环检查
【发布时间】:2016-05-18 22:08:45
【问题描述】:

我仍然是编程的初学者,我正试图弄清楚为什么这个循环不起作用。要求用户输入一个字符,我想我会检查该字符是否是三个正确字母之一。如果不是,他们可以重试,直到正确为止。至少是这样的想法。

char readOp()
{
    char op;

    do
    {
        cout << "Please choose desired operation: (a: add, m: multiply, s: squared)" << endl;
        cin.ignore(); //I was getting double cout, this removed one of them.
        op = cin.get();
    } while (op != 'a' && op != 'm' && op != 's');

    cout << "Got " << op << endl;
    return op;
}

编辑以反映更改:我已经解决了一些问题,但我仍然无法让我的循环工作。现在的问题是循环不会在提供正确的字符后终止。

如果有什么不同,整个段就是一个 char 函数。

我错过了什么?我只是因为现在是 04:04 而感到疲倦吗?

【问题讨论】:

  • cout 语句在哪里结束?
  • @JayKumarR 对不起,我忘了在我的例子中添加它! :)
  • 小改动后工作正常。请参阅ideone.com/nuRinO
  • @Pang 结束双引号是什么意思?
  • @Pang 我现在明白你的意思,找到并修复了。干杯。

标签: c++ loops char


【解决方案1】:

不知何故解决了我自己的代码。

我将op = cin.get(); 换回原来的cin &gt;&gt; op; 并删除了cin.ignore();,现在它就像魔术一样工作。我不知道为什么,但我会接受它。 :P 感谢其他帮助!

【讨论】:

    【解决方案2】:

    您的代码似乎没有任何真正的问题,但您可能会看到无限循环,因为您以某种方式获得了文件结尾并且您没有对此进行测试。只需添加对EOF的合理处理,例如这样;

    char readOp() {
      char op;
      cout << "Please enter ....blah blah" << endl;
      do {
        if (cin.eof()) return 'x';  // <-- add some EOF handling
        cin >> op;
      } while (op != 'a' && op != 'm' && op != 's');
      cout << "exit";
      return op;
    }
    

    编辑: 您还应该查看调用readOp 的代码——我敢打赌(猜测)那里有一个未正确测试返回值的外循环,因此再次调用readOp

    【讨论】:

    • 嗯,我可能应该提到它只是我的代码的摘录,它会在循环完成后继续。除非我弄错了文件结尾是什么。
    • 您从cin 读取的输入将在某个时间点出现文件结束条件——如果终端是当你按下 ctl-d 时——如果在管道或套接字中是当另一边关闭 - 并且有一个文件,它是文件结束的时候
    • 我尝试添加 EOF 处理,但它给了我与以前相同的结果。还是,谢谢! :)
    • 您可能需要添加更多上下文,包括您传递到程序中的数据——我已投票结束该问题,因为我们无法重现您的问题
    • 好吧,我不会将任何值传递给函数,如果这就是你的意思。它所做的只是让用户决定他们想要的操作,然后返回那个字符。
    【解决方案3】:

    我会使用 std::string 来接收带有 std::cin 的用户输入

    string op;
    do
    {
        cout << "Please enter desired operation: (a: add, m: multiply, s: squared)";
        cin >> op;
    } while (op != "a" && op != "m" && op != "s");
    

    【讨论】:

    • 这更像是一个代码审查问题,而不是解决他的问题——除非你认为使用 std::string 实际上解决了他所询问的问题
    • 问题已被代码修复。用户绝对可以输入一个字符(或其他字符串),并且循环不会像以前那样无限期地运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2015-04-22
    相关资源
    最近更新 更多