C++ C++;检查字符串是否至少包含1个数字和1个字母

C++ C++;检查字符串是否至少包含1个数字和1个字母,c++,C++,我试图在返回true之前检查字符串输入是否至少包含一个数字和一个字母 我的方法是首先循环使用这个词。 如果单词不包含isalpha或isdigit,则返回false 检查之后,我创建了两个计数(一个用于数字,一个用于字母)。我检查isalpha,然后在计数中添加一个。然后我检查isdigit,并将其添加到该计数中 最后,我检查两个计数是否大于或等于1(意味着它至少包含一个数字和一个字母),并返回true。我知道计数不是最好的方法,但我只是想测试一下这个方法,但它失败了,我不确定我的逻辑哪里是错的

我试图在返回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;
    }
}

bool-isDigitLetter::filter(字符串字){
整数位数=0;
int字母=0;
if(word.empty()){
返回false;
}
for(int i=0;i=1){
返回true;
}
}

我在想也许可以使用
isalnum
,但如果它包含其中一个,则返回true,但不检查它是否至少包含其中一个。

bool isDigitLetter::filter(字符串字){
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);
} 
bool hasLetter=false; bool hasDigit=false; for(int i=0;i
此解决方案删除了大量不必要的代码

基本上,它在字符串中循环并检查每个字符是字母还是数字。每次看到一个,它都会更新hasLetter/hasDigit变量。然后,如果两者都为true,则返回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;
} 

bool-isDigitLetter::filter(字符串字){
bool hasLetter=false;
bool hasDigit=false;
for(int i=0;i
应该是这样的:

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));
}

bool-isDigitLetter::filter(字符串字){
整数位数=0;
int字母=0;
if(word.empty()){
返回false;
}
//for(int i=0;i0)和&(字母>0));
}

您的问题在于这一行:

if(digit && letter>= 1)
将其更改为:

if(digit >=1 && letter>= 1)

使用调试器并逐步完成程序。查看与预期不同的地方,并更详细地检查该行。使用调试器。
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”不需要完整的计数。一个循环就足够了;它只需要跟踪是否看到一个数字和一个字母,一旦看到这两个数字,就完成了。嗯……不完全如此。
if(digit)
相当于
if(digit!=0)
;是的,这与检查
=1
不一样,因为
数字的负值也是如此,但因为
数字
从0开始,只上升,它们做同样的事情。你的编辑并不能使它成为一个更好的答案。这一行不是问题。@SandraK我知道这是一个逻辑错误,但无意中没有影响代码执行。无论如何都必须纠正。如果
字母
数字
都大于0,循环也可以提前终止。另外,请注意,
返回
语句中的括号是多余的。
返回数字>0&&letter>0;
做的事情完全相同。只是开玩笑,没有冒犯:)@p-a-o-l-o——多余的括号使代码更难阅读;你必须弄清楚它们是否真的有意义。初学者喜欢它们,但程序员不是初学者,需要学习编写代码而不增加干扰。是的,任何系统从0.1微秒的提升中都会获得惊人的收益。:)谢谢你,我相信你的if语句你少了一个括号?你总共打开了3个,但关闭了2个。嗯,让我看看你的报税表上还有一个分号(编辑前)哦,好的,找到了-修复了…编辑了-好吗?@godlyplusplust就是这样。还有
报税表后的分号(hasLetter&&hasDigit)