【问题标题】:I got an infinite while loop with this string [duplicate]我用这个字符串得到了一个无限的while循环[重复]
【发布时间】:2021-05-05 03:20:18
【问题描述】:

所以我在这里得到了这部分代码:

string stringparam;

string stringparam1;

double d;

unsigned x;


cout << "Welcome" << endl;

cout << "Choose one (ASUS, MSI, Gigabyte, ASrock)" << endl;
cin >> stringparam;
while (stringparam != "ASUS" || "MSI" || "Gigabyte" || "ASrock")
{
    cout << "you gave bad input \n" << endl;
    cout << "Choose one (ASUS, MSI, Gigabyte, ASrock)" << endl;
    cin >> stringparam;
}

问题是即使我给他一个正确的答案,比如“华硕”,它仍然给我错误信息:“你输入错误” 我该怎么办?

【问题讨论】:

  • stringparam != "ASUS" || "MSI" || "Gigabyte" || "ASrock" 不会像您认为的那样做。与(stringparam != "ASUS") || "MSI" || "Gigabyte" || "ASrock" 相同,"MSI" 始终为真。你想要stringparam != "ASUS" &amp;&amp; stringparam != "MSI" &amp;&amp; ...
  • 只是盲目地猜测语法是行不通的。通过阅读运算符了解 stringparam != "ASUS" || "MSI" || "Gigabyte" || "ASrock" 的真正含义。
  • 这是我能找到的最接近的:stackoverflow.com/questions/28144294/…。你的条件是:"(stringparam is not "ASUS") or ("MSI") or ..." not "stringparam is not ("ASUS" or "MSI" or ...)"
  • or 无论如何都是错误的运算符,即使您解决了不比较字符串的更明显问题。逻辑或与自然口语中使用的or 非常不同。
  • 感谢大家的快速响应,我会尝试多看一看

标签: c++ while-loop


【解决方案1】:

只是盲目地猜测语法是行不通的。我建议通过阅读运算符来了解 stringparam != "ASUS" || "MSI" || "Gigabyte" || "ASrock" 的真正含义。

你可以做这样的事情以一种非常简洁的方式实现你想要的。它需要 C++11 或更高版本。

std::set<std::string> ss = {"ASUS","MSI" , "Gigabyte","ASrock" };

while(ss.find(stringparam) == ss.end()) {

【讨论】:

    【解决方案2】:

    这里的主要问题是你不能用“或”操作符做你想做的事,因为那样的话,while 条件永远是 True。

    例如: 如果你输入“ASUS”,while 的结果是 True,这是因为你只需要一个 || expression = True 以“进入”while 的主体(这会导致无限循环)。

    所以你必须使用“&”运算符。有了这个,所有条件都必须为真才能执行 while 的主体。

    while (stringparam != "ASUS" && "MSI" && "Gigabyte" && "ASrock")
    

    或者,您可以使用 do/while 循环:

    do{
        cout << "you gave bad input \n" << endl;
        cout << "Choose one (ASUS, MSI, Gigabyte, ASrock)" << endl;
        cin >> stringparam;
    }while(stringparam != "ASUS" && stringparam != "MSI" && ...);
    

    【讨论】:

    • 它现在可以工作了,感谢您的帮助
    • 不客气!祝你有美好的一天! :)
    • cout &lt;&lt; cout &lt;&lt; .. 编译?
    • @AndreaMaestrutti 很高兴您以正确的方式使用它。通常情况下,这样的 cmets 完全没有任何恶意。但我认为这个答案应该进一步改进。您正在将“做事”作为核心,但这与问题并没有真正的关系。这只是一个改进。但是您没有解释为实际解决问题所做的任何事情。
    • @AndreaMaestrutti 我删除了我的反对票,因为你的反应很好。纠正我提到的问题并投赞成票。 ;)
    【解决方案3】:

    是的,您的代码进入无限循环 因为,您已将字符串与 OR 运算符一起使用。 在 C++ 中,除了 O、null、空字符串之外的任何内容都是正数。 因此,您的 while 循环条件始终为真。 这就是你的代码进入无限循环的原因。

    【讨论】:

    • 你的解释是错误的。假设 O == 0 和一个空字符串也是一个返回 true 的字符串。您可能的意思是使用 string.empty(),这完全不同。
    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 2016-06-08
    • 2014-03-28
    • 1970-01-01
    • 2012-04-04
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多