我试图在返回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。
答案 0 :(得分:1)
bool isDigitLetter::filter(string word) {
bool hasLetter = false;
bool hasDigit = false;
for (int i = 0; i < word.size(); i++) {
if (isdigit(word.at(i))) { hasDigit = true; }
if (isalpha(word.at(i))) { hasLetter = true; }
}
return (hasLetter && hasDigit);
}
此解决方案删除了大量不必要的代码。
基本上,它遍历字符串并检查每个字符是字母还是数字。每次看到一个,它都会更新hasLetter / hasDigit变量。如果两者都为真,则返回true,否则返回false。
编辑:这个解决方案更快 - 如果它已经看到一个字母和一个数字,它会立即返回。
bool isDigitLetter::filter(string word) {
bool hasLetter = false;
bool hasDigit = false;
for (int i = 0; i < word.size(); i++) {
if (isdigit(word.at(i))) { hasDigit = true; }
if (isalpha(word.at(i))) { hasLetter = true; }
if (hasDigit && hasLetter) { return true; }
}
// we got here and couldn't find a letter and a digit
return false;
}
答案 1 :(得分:1)
应该是这样的:
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;
}
}
return ((digit > 0) && (letter > 0));
}
答案 2 :(得分:0)
你的问题在于这一行:
if(digit && letter>= 1)
将其更改为:
if(digit >=1 && letter>= 1)