如何在 C++ 中创建一个带有多个条件的 while 循环

4
cout << "Options:\n1: Change Name\n2: Change Password\n3: Change Address\n4: Withraw\n5: Deposit\nL: Log out\n>";
while (user_input2 != '1' && user_input2 != '2' && user_input2 != '3' && user_input2 != '4' && user_input2 != '5' && user_input2 != 'L')
{
    cout << "Invalid input";
}

那么我如何缩短while条件呢?
我尝试了这样做:
cout << "Options:\n1: Change Name\n2: Change Password\n3: Change Address\n4: Withraw\n5: Deposit\nL: Log out\n>";
while (user_input2 != '1','2','3','4','5','L')
{
    cout << "Invalid input";
}

但是它没有起作用。

编辑1:“我添加了更多提示,说明我想做什么。”


1
逗号运算符可能会编译,但它不会做你想要的事情。 - drescherjm
1
我认为你在第一个代码块中犯了一个错误。使用 "or" || 运算符,条件将始终满足任何值 user_input 可以取到。我认为你想使用 "and" && 运算符。 - Patrick
这似乎是一个重复的问题 https://dev59.com/Gbroa4cB1Zd3GeqPnpzq,尽管它使用了 if 而不是 while - cigien
1
你要比较的值总是字符吗?它们是否连续? - cigien
其实我并不在乎数字是否有序,这些字母只是选项加上L,它将成为while循环的退出选项,我只是想知道有没有一种方法可以在不键入过多内容的情况下实现“user_input2!=”条件适用于我想要的所有字符。谢谢您的帮助。 :) - MJ DLS
显示剩余4条评论
3个回答

9
你可以使用<>操作符来表示从'1''5'的范围,但是你必须明确处理'L'的检查。
while (user_input2 != 'L' && (user_input2 < '1' || user_input2 > '5'))
{
    cout << "Invalid input";
}

1
也许可以给初学者程序员提供一些关于字符编码的简短解释? - Patrick
3
@Patrick- 这里实际上并不涉及字符编码。在C++和C语言中,数字['0' .. '9']被要求是连续递增的。因此,这个测试对于编译器支持的任何字符编码都是有效的。 - Pete Becker
它没有起作用,char输入中有一个L。因此选项是('1','2','3','4','5','L')。 - MJ DLS
@MJDelosSantos 再多努力一点。这里提出的条件处理了 user_input2 是介于 1 和 5 之间的数字的情况。如果您有一个额外的有效字符,可以使用此代码:input < '1' || input > '5' || input == 'L' - Patrick

3
你也可以写:

你还可以编写:

while (user_input2 != '1' && user_input2 != '2' && user_input2 != '3' && user_input2 != 
'4' && user_input2 != '5')
{
    cout << "Invalid input"
}

这个 while 条件太长了,我想缩短它以节省我的时间和手指的敲打。 - MJ DLS

2
如何提供一个函数,其中您将所有接受的字符作为字符串提供?
演示:
#include <iostream>

bool checkValid(char cChk, std::string_view allowed)
{
  for (char c : allowed) if (cChk == c) return true;
  return false;
}

int main()
{
  char user_input2;
  std::cin >> user_input2;
  if (!checkValid(user_input2, "12345L")) {
    std::cout << "Invalid input\n";
  }
}

在 coliru 上的实时演示

顺便提一下,还有一个标准的 C 库函数(被采用于 C++ 标准),也可以使用:

std::strchr()

它返回找到的字符指针或 nullptr,并且可以像上面示例中的 checkValid() 一样使用:

#include <cstring>
#include <iostream>

int main()
{
  char user_input2;
  std::cin >> user_input2;
  if (!std::strchr("12345L", user_input2)) {
    std::cout << "Invalid input\n";
  }
}

在coliru上的实时演示


再三思考(关于OP可能的意图),我开始问为什么需要进行检查。假设有效的输入必须以某种方式被处理(我会使用switch),那么无效的输入也可以被覆盖。

演示:

#include <iostream>

int main()
{
  for (char user_input2; std::cin >> user_input2;) {
    switch (user_input2) {
      case '1': std::cout << "Change Name\n"; break;
      case '2': std::cout << "Change Password\n"; break;
      case '3': std::cout << "Change Address\n"; break;
      case '4': std::cout << "Withraw\n"; break;
      case '5': std::cout << "Deposit\n"; break;
      case 'l': case 'L': std::cout << "Log out\n"; return 0;
      default: std::cerr << "Invalid input!\n";
    }
  }
}

输入:

12AL

输出:

Change Name
Change Password
Invalid input!
Log out

Live Demo on coliru


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接