我是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)) )
这样的东西可以工作,但我似乎不明白这与我原来的东西有什么不同。
1条答案
按热度按时间1l5u6lss1#
正如评论者指出的那样,在表达中:
...首先计算子表达式
0 || 1 || 2
,因为这是一个常量表达式,所以实际上总是调用:我们可以做到:
...但是当我们想要测试更多的指数时,这很快就会失控。
我们可以使用
std::string::find_first_of
:对于较大的字符集,
std::find_if
或std::ranges::find_if
也适用。注意事项
通常,您可能希望避免使用
<cctype>
中的函数。他们:int
,而不是bool
EOF
以外的负值时,它们的行为是未定义的,这在使用char
时很容易发生