【发布时间】:2018-01-04 15:11:42
【问题描述】:
我正在尝试在返回 true 之前检查字符串输入是否至少包含一个数字和一个字母。
我的方法是首先循环遍历单词。
如果单词不包含isalpha 或isdigit,则返回false。
在那次检查之后,我创建了两个计数(一个用于数字,一个用于字母)。我检查isalpha 是否在计数中加一。然后我检查是否isdigit 并添加到该计数中。
最后,我检查两个计数是否大于或等于 1(意味着它至少包含一个数字和一个字母)并返回 true。我知道计数不是最好的方法,但我只是想测试该方法,但它无法正常工作,我不确定我的逻辑哪里错了。
bool isDigitLetter::filter(string word) {
int digit = 0;
int letter = 0;
if(word.empty()) {
return false;
}
for(int i = 0; i < word.length(); i++) {
if(!isalpha((unsigned char)word[i]) || !isdigit((unsigned char)word[i])) {
return false;
}
}
for(int x = 0; x < word.length(); x++) {
if(isalpha((unsigned char)word[x])) {
letter+=1;
}
if(isdigit((unsigned char)word[x])) {
digit+=1;
}
}
if(digit && letter>= 1) {
return true;
}
}
我在想也许可以使用isalnum,但如果它包含任何一个,但不检查它是否至少包含一个,这将返回 true。
【问题讨论】:
-
使用调试器并逐步执行程序。查看与您期望的不同之处并更详细地检查该行。
-
使用调试器。
-
if(digit && letter>= 1)这永远是真的 -
bool isDigitLetter::filter(std::string word){ return std::any_of(word.begin(), word.end(), [](char c){ return std::isalpha(c); }) && std::any_of(word.begin(), word.end(), [](char c){ return std::isdigit(c); }); } -
“至少 1”不需要完整计数。一个循环就足够了;它只需要跟踪是否它看到了一个数字和一个字母,一旦看到了两者,它就完成了。
标签: c++