C++,访问If-Else语句中的字符串字符(初学者问题)

xzv2uavs  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(194)

我是C++的新手,有一个关于我遇到的一些问题。
我的任务是从输入中读入一个3个字符的字符串到变量passwordStr中,声明一个布尔变量containsDigit,如果passwordStr包含一个数字,则将containsDigit设置为true。否则,将containsDigit设置为false。
我目前拥有的:

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() {
    string passwordStr;
   
   bool containsDigit;
   
   getline(cin, passwordStr);
   
   if (isdigit(passwordStr.at(0 || 1 || 2))) {
      containsDigit = true;
   }
   
   if (containsDigit) {
      cout << "Valid password" << endl;
   }
   else {
      cout << "Invalid password" << endl;
   }

    return 0;
}

为什么(isdigit(passwordStr.at(0 || 1 || 2)))不适用于我打算做的事情,这背后的逻辑和推理是什么?
我知道像( isdigit(passwordStr.at(0)) || isdigit(passwordStr.at(1)) || isdigit(passwordStr.at(2)) )这样的东西可以工作,但我似乎不明白这与我原来的东西有什么不同。

1l5u6lss

1l5u6lss1#

正如评论者指出的那样,在表达中:

isdigit(passwordStr.at(0 || 1 || 2))

...首先计算子表达式0 || 1 || 2,因为这是一个常量表达式,所以实际上总是调用:

isdigit(passwordStr.at(true)) // true is converted to 1 in at()

我们可以做到:

bool containsDigit = isdigit(passwordStr.at(0)) ||
                     isdigit(passwordStr.at(1)) ||
                     isdigit(passwordStr.at(2));

...但是当我们想要测试更多的指数时,这很快就会失控。
我们可以使用std::string::find_first_of

bool containsDigit = passwordStr.find_first_of("0123456789") != string::npos;

对于较大的字符集,std::find_ifstd::ranges::find_if也适用。

注意事项

通常,您可能希望避免使用<cctype>中的函数。他们:

  • 通常不会内联,这使得它们的效率较低,并且
  • 它们返回非零/零int,而不是bool
  • 当向它们传递除EOF以外的负值时,它们的行为是未定义的,这在使用char时很容易发生

相关问题