повторение цикла printf, но не scanf - PullRequest
0 голосов
/ 30 июня 2018

Я сделал простую (и некрасивую) программу для проверки пароля, который вводит пользователь для прописных, строчных букв, числа и знака доллара. проблема в том, что мой printf в начале цикла do while повторяется неловко, пока scanf даже не останавливает его, и это повторение зависит от ввода пользователя. Я добавил несколько комментариев, чтобы объяснить код, и я сделаю несколько снимков экрана, чтобы показать вам, что я имею в виду, повторяя printf.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<ctype.h>

int main(){
char pass[10];
int i,t,x,y,z;
t=y=z=0;

do{
    printf("Enter a password it needs to have an uppercase letter a lowercase one, a number and a $ sign: ");
    scanf(" %c", pass);



    //here i test for upper case, letter by letter
    for(i=0;i<10;i++){
        if(isalpha(pass[i])){
            if(isupper(pass[i])){
                t++;
            }
        }
    }

    //here i test for lower case, letter by letter
    for(i=0;i<10;i++){
        if(isalpha(pass[i])){
            if(islower(pass[i])){
                y++;
            }
        }
    }

    //here i test for number, letter by letter
    for(i=0;i<10;i++){
        if(isdigit(pass[i])){
            z++;
        }
    }

    //here i look for the dollar sign
    for(i=0;i<10;i++){
        if(pass[i]=='$'){
            x++;
        }
    }

    printf("\n");

    //if all the tests were true the variables t,x,y and z would not be 0
}while(t==0 || x==0 || y==0 || z==0);

}

первое отображение кода работает нормально: введите описание изображения здесь

однако, как вы увидите на этом рисунке, когда я ввожу неверный пароль, printf повторяется: введите описание изображения здесь

и повторение printf зависит от того, сколько пользователь вводит: введите описание изображения здесь

даже когда я ввожу надежный пароль, printf повторяется много раз, прежде чем код заканчивается: введите описание изображения здесь

Я предполагаю, что проблема заключается в циклах for в постели в цикле do while, но я просто не могу найти, где именно проблема и почему printf так странно повторяется

1 Ответ

0 голосов
/ 30 июня 2018

Основная проблема с:

scanf(" %c", pass);

Это пытается сканировать в одном символе. Для сканирования в строке используйте:

scanf("%9s", pass);

9 устанавливает ограничение на количество вводимых символов, чтобы избежать переполнения. 10 не используется, потому что вам нужно оставить место для маркера конца строки ('\ 0').

Некоторые другие улучшения:

do{
    // Move here to reset each time
    t = y = z =0;

    printf("Enter a password it needs to have an uppercase letter a lowercase one, a number and a $ sign: ");

    // Should always test the result of scanf
    if (1 != scanf("%9s", pass)) {
        // Some error
        break;
    }

    // Combine all the for loops
    for (i = 0; pass[i]; i++) {
        if (isupper(pass[i])) {
            t++;
        }
        else if (islower(pass[i])) {
            y++;
        }
        else if (isdigit(pass[i])) {
            z++;
        }
        else if (pass[i] == '$'){
            x++;
        }
    }

    printf("\n");

    //if all the tests were true the variables t,x,y and z would not be 0
} while (t==0 || x==0 || y==0 || z==0);
...