首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查输入的值中是否有数字

检查输入的值中是否有数字
EN

Stack Overflow用户
提问于 2015-08-27 20:24:07
回答 4查看 69关注 0票数 0

我试图让我的程序检查为password_entered输入的值中是否有一个数字。

我目前有一个c,它看起来像:

代码语言:javascript
复制
int CFD(char password_entered[]);
int main()
{
    char password_entered[20]; //max is 20 char

    /*do{*/
        printf("password?? \n");
        scanf("%s", password_entered);

        if(CFD(password_entered))
        {
           //contains digit(s) character.
        }
        else{
           // no digits
        }


    /*}*/



    return 0;
}


int CFD(char password_entered[]){
    int i;
    for(i=0; i<strlen(password_entered); i++){

        if( isdigit(password_entered[i]) ){
            printf("\ndigit(s).\n");
            return true;
        }
        else{
            printf("\nno digit(s).\n");
            return false;
        }
    }
}

问题是,当我运行我的代码时,它总是掉进else{}中,我在这里做错了什么?

问题的一部分是,如果我输入了3,它可以工作,但不能使用John3 --我如何更好地评估这个问题呢?

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-27 20:29:18

您只测试密码的第一个字符,然后立即返回。试试这个:

代码语言:javascript
复制
int CFD(char password_entered[]) {
    int i;
    for (i=0; i<strlen(password_entered); i++) {
        if ( isdigit(password_entered[i]) ) {
            printf("\ndigit(s).\n");
            return 1;
        }
    }
    printf("\nno digit(s).\n");
    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2015-08-27 20:32:37

你的CFD功能就是这么做的

代码语言:javascript
复制
for each character in the password
    if that character is a digit
        then don't process any more characters, just return true
        otherwise don't process any more characters, just return false

你现在能看到问题了吗?你不可能知道密码中的任何一个字符都是数字,直到你看完它们!

你真的想要这样的东西:

代码语言:javascript
复制
for each character in the password
    if that character is a digit
        then don't process any more characters, just return true
if we get down here we know we've checked every character so return false
票数 2
EN

Stack Overflow用户

发布于 2015-08-27 20:28:55

我想这取决于您提供的输入,但是您的代码中有一个逻辑错误.

您的CFD函数“希望”迭代密码,但是不管它找到哪种类型的字符,它都会立即返回,这在处理第一个字符时会发生。

要解决这个问题,请尝试如下:

代码语言:javascript
复制
int CFD(char password_entered[]){
    int i;
    int hasdigits = 0;
    for(i=0; i<strlen(password_entered); i++){

        if( isdigit(password_entered[i]) ){
            printf("%c - digit\n", password_entered[i]);
            hasdigits = 1;
        }
        else{
            printf("%c - no digit\n", password_entered[i]);
        }
    }
    return hasdigits;
}

或者,如果您不希望打印,并希望尽快停止:

代码语言:javascript
复制
int CFD(char password_entered[]){
    int i;
    for(i=0; i<strlen(password_entered); i++){

        if( isdigit(password_entered[i]) ){
            return 1;
        }
    }
    return 0;
}

而且,无论您选择什么解决方案,重复调用strlen都是浪费的。您可以“向后走”,也可以使用一个变量来保持这样的长度:int i, l; for(i=0,l=strlen(password_entered); i<l; i++)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32258781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档