Jan Kvapil
Jan Kvapil

Reputation: 1

Function only returning return value it is not supposed to reach

I am working on a project for a programming class, where the goal is to verify a strength of a password based on different security levels. My problem is that with 2nd level, the:

Counter of numbers and special characters isn't working properly and isn't detecting numbers (it was working before I put it in its own function), but more importantly, the function only returns the value set in the very end. I have no idea what else to try.

int level2() {
    while ((fgets(given_string, 100, stdin) != NULL)) {
        for (int i = 0; given_string[i] != '\n'; i++) {
            if (given_string[i] >= 'a' && given_string[i] <= 'z') {
                lowerCaseLetterFound++;
            } else if (given_string[i] >= 'A' && given_string[i] <= 'Z') {
                upperCaseLetterFound++;
            } else if (given_string[i] >= '0' && given_string[i] <= '9') {
                numberFound++;
            } else {
                specialCharacterFound++;
            }
        }
    }

    printf("%d %d %d %d\n", lowerCaseLetterFound, upperCaseLetterFound, numberFound, specialCharacterFound);

    if (param == 1 || param == 2) {
        if (lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1) {
            return 1;
        } else {
            return 0;
        }
    } else if (param == 3) {
        if (((lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1) && numberFound >= 1) ||
            ((lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1) && specialCharacterFound >= 1)) {
            return 1;
        } else {
            return 0;
        }
    } else if (param >= 4) {
        if (lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1 && numberFound >= 1 &&
            specialCharacterFound >= 1) {
            return 1;
        } else {
            return 0;
        }
    }
    return 0;
}

PS: This is my first time asking question here, and I am a programming newbie. Thanks for your help.

Update: Adding the whole code as I have it RN.

char given_string[100];
int lowerCaseLetterFound = 0;
int upperCaseLetterFound = 0;
int numberFound = 0;
int specialCharacterFound = 0;
int repeatedCharacter = 0;
int param;
int level;

int level1 () {
    while ((fgets(given_string, 100, stdin) != NULL)) {
        for (int i = 0; given_string[i] != '\n'; i++) {
            if (given_string[i] >= 'a' && given_string[i] <= 'z') {
                lowerCaseLetterFound++;
            } else if (given_string[i] >= 'A' && given_string[i] <= 'Z') {
                upperCaseLetterFound++;
        }
    }
}
        if (lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1) {
                return 1;
            } else {
                return 0;
    }
}

int level2() {
    while ((fgets(given_string, 100, stdin) != NULL)) {
        for (int i = 0; given_string[i] != '\n'; i++) {
            if (given_string[i] >= 'a' && given_string[i] <= 'z') {
                lowerCaseLetterFound++;
            } else if (given_string[i] >= 'A' && given_string[i] <= 'Z') {
                upperCaseLetterFound++;
            } else if (given_string[i] >= '0' && given_string[i] <= '9') {
                numberFound++;
            } else {
                specialCharacterFound++;
            }
        }
    }

    printf("%d %d %d %d\n", lowerCaseLetterFound, upperCaseLetterFound, numberFound, specialCharacterFound);

    if (param == 1 || param == 2) {
        if (lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1) {
            return 1;
        } else {
            return 0;
        }
    } else if (param == 3) {
        if (((lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1) && numberFound >= 1) ||
            ((lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1) && specialCharacterFound >= 1)) {
            return 1;
        } else {
            return 0;
        }
    } else if (param >= 4) {
        if (lowerCaseLetterFound >= 1 && upperCaseLetterFound >= 1 && numberFound >= 1 &&
            specialCharacterFound >= 1) {
            return 1;
        } else {
            return 0;
        }
    }
    return 0;
}

/*
int level3() {
    while ((fgets(given_string, 100, stdin) != NULL)) {
        for (int i = 0; given_string[i] != '\n'; i++) {
            if (given_string[i] >= 'a' && given_string[i] <= 'z') {
                lowerCaseLetterFound++;
            } else if (given_string[i] >= 'A' && given_string[i] <= 'Z') {
                upperCaseLetterFound++;
            } else if (given_string[i] >= '0' && given_string[i] <= '9') {
                numberFound++;
            } else {
                specialCharacterFound++;
            }
        }
    }
}
 */

int main(int argc, const char *argv[]) {
    //ukládám argumenty, prozatím pouze 2 ze 3
    if (argc <= 1) {
        printf("Not enough arguments provided. Please, provide LEVEL and PARAM arugments.\n");
    } else if (argc >= 5) {
        printf("Too many arguments provided.\n");
    }
    int level = atoi(argv[1]);
    int param = atoi(argv[2]);

    if (level <= 0 || level >= 5) {
        printf("Level must be 1 through 4.\n");
    }

    if (param <= 0) {
        printf("Parameter is not a full positive number.\n");
    }

    //vyhodnocování na základě zadaných parametrů - kontrola
    //LEVEL = 1

    if (level == 1) {
        level1();
        if (level1() == 1) {
            printf("Password passed check 1.\n");
    } else {
            printf("Password did not pass check 1.\n");
        }
    }

    if (level == 2) {
        if (level1() == 1) {
            if (level2() == 1) {
                printf("Password did pass the check.\n");
            }
        } else {
            printf("Password did not pass the check.\n");
        }

        if (level1() == 0) {
            printf("Password did not pass the check.\n");
        }
    }

    if (level == 3) {

    }
}

Upvotes: 0

Views: 117

Answers (2)

Runt8
Runt8

Reputation: 611

It looks like the problem is that you’re re-defining your global variables in your main function. For example, when you do int param = atoi(argv[2]); in your main, param is scoped to your main. As soon as you leave your main function, you will be accessing the global param which has never been set.

You can either remove the variable type in your main so you are setting the global variables:

param = atoi(argv[2]);

Or get rid of the global variables and pass the ones created in main to any function that needs them.

Upvotes: 0

FATEMEH MOUSAVI
FATEMEH MOUSAVI

Reputation: 21

Try to put your code in more than one function.

I think you can't print sth in your function. You should return just one thing you want to get from your function and then in another function, get input the first function's return.

Upvotes: 1

Related Questions