2015-08-27 2 views
0

Я пытаюсь получить свою программу, чтобы проверить, имеет ли значение, введенное для password_entered, цифру где-то в нем.Проверьте, имеет ли введенное значение цифры

В настоящее время я c, что выглядит следующим образом:

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 - как я могу лучше оценить это?

Спасибо!

+0

Вам не хватает функции 'isdigit'. – Bitmap

+1

вы только проверяете первый символ пароля и сразу возвращаетесь из функции 'CFD' – wimh

+0

@Bitmap - смотрите под CFD() – CodeTalk

ответ

2

Вы проверяете только первый символ своего пароля и сразу же возвращаетесь. Попробуйте это:

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; 
} 
+0

Итак, вы говорите, что else {} не нужен ? – CodeTalk

+0

Btw, это не определяет цифру, введенную, если я положил «Jenkins1» – CodeTalk

+0

@ CodeTalk'else' в ваш код заставляет функцию немедленно возвращаться, если первый символ не является цифрой. Это не «не нужно», это делает ваш код неправильным в этом случае. – Sleafar

1

Я предполагаю, что это будет зависеть от входа вы предоставляете, но есть логическая ошибка в коде ...

Вашей CFD функции «хочет», чтобы перебрать пароль, но независимо от типа характера он находит, он сразу возвращается, и это происходит при обработке первого символа.

Чтобы исправить это, попробуйте так:

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

Или, если вы не хотите печатать, и хотите, чтобы остановить как можно скорее:

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++).

+0

для второго решения вверх, для первого вниз 1 + -1 = 0 :). Мне не нравится, что вы создаете дополнительную переменную только для возврата. –

+0

@GRC, вы хотите предложить другой метод - если вы хотите печатать для каждого персонажа? – Amit

+0

Ой, думаю, я понимаю, что вы имеете в виду. Я даже не обратил внимания на напечатанный текст :-) Очевидно, нет смысла печатать это ... – Amit

2

Ваша функция CFD делает это

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 

Можете ли вы сейчас видите проблему? Вы не можете знать, что ни один из символов в пароле не является цифрой, пока вы не посмотрели на них все!

Вы действительно хотите что-то вроде этого:

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 
+0

Можете ли вы показать код? Это полезно, но где я возвращаю true, а затем возвращаю false? – CodeTalk

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

}

возвращение заявление в каждой из если и еще возвращается из функции CFD немедленно. Независимо от того, является ли первый символ цифрой, функция считывает только первый символ.

Решение «учебника» для такого рода проблем состоит в том, чтобы «только вернуться из одного места в любую функцию». Этого можно достичь, назначив возвращаемое значение в if и else, а затем вернув его в конце выполнения, после цикла for. Это первое решение Амита, и оно хорошее.

Вы находитесь на правильном пути, хотя, когда вы говорите (в своем комментарии выше), что другое не нужно ...вы также можете сделать это (возвратите false нормально, только верните true, если найдена цифра):

int CFD(char password_entered[]) { 
    for(int i = 0; i<strlen(password_entered); i++) { 
     if(is digit(password_entered[i]) { 
      return true; 
     } 
    } 
    return false; 
} 
Смежные вопросы