【问题标题】:While condition: How to allow comparison between non-integer/double user input and integer limitsWhile 条件:如何允许在非整数/双用户输入和整数限制之间进行比较
【发布时间】:2021-04-03 22:27:51
【问题描述】:

目标:运行一个 while 循环,该循环将重复,直到用户输入一个介于 1-3(含)之间的整数。所以如果输入小于1或大于3的整数或输入任何字符或字符串,循环重复。

我的菜鸟知识:我知道当用户输入是整数时如何比较用户输入,但当它是字符或字符串数​​据类型输入时,我得到的只是一个无限循环。另外,我将 inputtable 变量声明为整数,所以不知道该怎么做。

我进行了一些 Google 搜索,但似乎找不到与我的问题相似的问题。
非常感谢您的建议:)

代码如下:

int Decision1 = 4;

while ( Decision1 < 1 || Decision > 3)
      {
        std::cout << "Enter answer here: ";
        std::cin >> Decision1;
        std::cout << "\n\n";
      }

【问题讨论】:

标签: c++ string while-loop char integer


【解决方案1】:
int Decision1;
while(std::cin >> Decision1) {
   if(Decision1 >= 1 && Decision1 <= 3) break;
   // todo
}

【讨论】:

  • OP 要求一段时间循环,直到用户输入有效输入。在您的代码中,如果用户输入无效输入 0 将被分配给 Decision 并且不会进入循环
【解决方案2】:

您可以使用 ASCII 码来检查数字或字符。

    #include <iostream>

int main() {
  char Decision1 = '0';

while (  (Decision1 < 49 && Decision1 >=47) ||  (Decision1 >51 && Decision1 <=57 ))
      {
        std::cout << "Enter answer here: ";
        std::cin >> Decision1;
        std::cout << Decision1;
        std::cout << "\n";
      }
}

希望对你有所帮助。

【讨论】:

  • 绝对没有理由将此代码限制为仅限 ASCII 机器。请改用字符文字和 &lt;cctypes&gt; 标头。
  • 您好,感谢您的意见,有几个问题。在您的 while 条件代码中: ``` while ( (Decision1 =47) || (Decision1 >51 && Decision1
  • 您可以使用条件返回错误,也可以使用 throw exception 来返回错误。
  • 不要对该范围的值进行硬编码。 all 字符编码要求数字的字符代码是连续的。所以你可以写Decision1 &gt;= '1' &amp;&amp; Decision1 &lt;= '3'。这将适用于 all 字符编码。我不知道if 语句的后半部分试图做什么,这恰恰说明了为什么硬编码值是一种不好的方法。
【解决方案3】:

请记住:当您阅读来自std::cin 的输入时,您阅读的是在控制台输入的文本。流提取器尝试将该文本转换为目标类型。也就是说,在

int i;
std::cin >> i;

&gt;&gt; 运算符查找数字字符并计算出这些字符代表的值。如果字符无法转换为整数值,则提取失败。流具有到bool 的转换,它告诉您流是否处于良好状态,或者尝试的操作是否失败。所以:

int i;
if (std::cin >> i)
    std::cout << "got a value!\n";

要编写一个提示输入有效的循环,您需要反转测试:

int i;
while (!(std::cin >> i) {
    std::cout << "bad input\n":
    // now clear the input stream, so it's back in a good state
}

检查该值是否在要求的范围内,只需这样做:

int i;
while (!(std::cin >> i) || i < 1 || i > 3) {
    std::cout << "bad input\n":
    // now clear the input stream, so it's back in a good state
}

要清除输入流,您必须重置其内部标志。你可以用std::cin.clear(); 做到这一点。而且,根据您认为输入的内容,您可能希望删除用户输入的任何其他字符。你可以用std::cin::ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n') 来做。这告诉流丢弃字符,直到它到达换行符(按 ENTER),或者直到它读取了大量字符。

把它们放在一起:

int i;
while (!(std::cin >> i) || i < 1 || i > 3) {
    std::cout << "bad input\n":
    std::cin.clear();
    std::cin::ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

是的,当输入是有效整数但超出范围时,这会清除流状态并刷新输入;这是无害的。这是浪费时间,但键盘输入的速度受到用户输入速度的限制,这比此循环中的代码执行的任何操作都慢得多

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多