Challenge 1# Completed

+3 Aleksander Olewinski · January 11, 2015
Hello. Here is my first challenge :)


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

int main()
{
    char password[21];
    char rpassword[21];
    char decision;
    int i=0;
    int big=0;
    int number=0;
    int howLong=0;

    printf("Welcome. Before you type your password please read this carefully!\nPassword should have minimum length of 6 and maximum length of 20 characters.\nPassword should include one or more: capital letter and number.");
    COMEBACK:printf("\nPlease enter your password: ");
    scanf(" %s", password);
    printf("\nPlease repeat your password: ");
    scanf(" %s", rpassword);
    if(strcmp(password, rpassword) !=0){
        printf("\nPassword does not match repeated password. Please try again.");
        printf("\nPlease enter your password: ");
        scanf(" %s", password);
        printf("\nPlease repeat your password: ");
        scanf(" %s", rpassword);
    }

    while(password!='\0'){
        if(isupper(password)){
            big+=1;
            howLong+=1;
            i++;
        }
        else if(isdigit(password)){
            number+=1;
            howLong+=1;
            i++;
        }
        else{
            i++;
            howLong+=1;
        }
    }

    printf("%d %d %d",big, number, howLong); //just checking if it is working :)

    if((big>0) && (number>0) && (howLong>=6)){
        printf("\nYour password match the criteria!");
    }
    else{
        printf("\nYour password does not match the criteria! Try again!");
        printf("\nDo you want try enter your password again? (y/n): " );
        scanf(" %c", &decision);
        switch(decision){

        case 'y' : howLong=0;
        int i=0;
        int big=0;
        int number=0;
        goto COMEBACK;

        case 'n' : printf("\nSee you soon");
        break;

        default : printf("\nI do not know what does this mean. Bye!");
        break;}

    }
    
    getchar();
    return 0;
}

Post a Reply

Replies

- page 1
Oldest  Newest  Rating
+2 Bucky Roberts · January 11, 2015
+2 c student · January 17, 2015
challenge accepted
messing up your buffers:
http://i.imgur.com/3ymsElt.png

finishing you off with a classic segmentation fault:
http://i.imgur.com/khJdfmR.png

flawless victory... fatality.   8-)
0 Aleksander Olewinski · January 11, 2015
Thanks Bucky :). You are very good teacher!
0 c student · January 12, 2015
http://i.imgur.com/eGbg7eC.png
it doesn't matter if you're telling someone you can only have a max number of input, if it can break, it will break.
0 Lazar Bulic · January 24, 2015
Boom my first code here. Here is the improved version of your code :) 

thing i changed: 

I don't like scanf when using strings and characters. I always use getchar() and gets()
Also i changed your variable declaration its more neater now.
I removed the variable that counts the length of string as you have a function strlen()
Also removed libraries that aren't used.
Also i added goto COMEBACK if user passwords don't math, this way he can make more mistakes and correct them. Your code just game an option to make mistake once.


I would remove variable index and do the check with a pointer on string (would declare your strings like pointers char *passowrd[21]) but dnk if your are familiar with pointers so i didn't use that.


#include <stdio.h>
#include <string.h>

main()
{
    char password[21], rpassword[21], decision;
    int index, number=0, big=0;

    printf("Welcome. Before you type your password please read this carefully!\nPassword should have minimum length of 6 and maximum length of 20 characters.\nPassword should include one or more: capital letter and number.");
    COMEBACK: printf("\nPlease enter your password: ");
    gets(password);
    printf("\nPlease repeat your password: ");
    gets(rpassword);
    if(strcmp(password, rpassword) != 0){
        printf("Yuor password doesn't match! Try again!\n");
        goto COMEBACK;
    }

    for(index=0; index<=strlen(password); index++){
        if(isupper(password[index]))
            big++;
        else{
            if(isdigit(password[index]))
                number++;
        }
    }

    printf("%d %d %d",big, number, strlen(password));

    if((big > 0) && (number > 0) && (strlen(password) >= 6)){
        printf("\nYour password match the criteria!");
    }
    else{
        printf("\nYour password does not match the criteria! Try again!");
        printf("\nDo you want try enter your password again? (y/n): " );
        decision = getchar();
        switch(decision){

        case 'y' :
        index=0;
        big=0;
        number=0;
        fflush(stdin);
        goto COMEBACK;

        case 'n' : printf("\nSee you soon");
        break;

        default : printf("\nI do not know what does this mean. Bye!");
        break;}

    }

    getchar();
    return 0;
}
0 c student · January 24, 2015
here is your gets() function:
warning: the `gets' function is dangerous and should not be used.
it is still susceptible to overflowing

also, you attempt to return a value where main has no declared return type.
0 Mathias Frits Rørvik · January 21, 2015
This is not working correctly, you are calling isdigit/upper/lower() on password, and not password. By not doing this you are ONLY checking the first character of password. 

Bucky, why do you say that the code is correct, when it clearly it is not? 
0 Aleksander Olewinski · January 17, 2015
Wow... That is a punch. I am begging for mercy ;). I see there is many things to learn to make the program completely unbreakable. Thank you for your advice about posting my code :D. You win.  
0 Aleksander Olewinski · January 21, 2015
?????????
Mathias, with all respect. In my code 'while' loop is checking every single character until it reach end of string. God help me but I do not understand what is your point. If anything is wrong in your opinion explain it like c student did!
Maybe you just mistook it with put and gets method? Just can You explain it clearly?
0 Mathias Frits Rørvik · January 21, 2015
Tell me at which point do you check every position? Your program doesn't even quit, it is stuck in an infinite loop. Have you tried running your own program? You are incrementing the variable i, but you are not checking password at position i

isdigit, isupper expects a character as a parameter. What is the type of password? It is a character array. 
while(password[index] != '\0') {
  if(isupper(password[index)){
      big+=1;
      i++;
  }
  else if(isdigit(password[index])){
      number+=1;
     i++;
  }
  else {
     i++;
  }
}

When you compile the program, don't you get any warnings?
  • 1
  • 2

C

107,273 followers
About

One of the most popular languages of all time.

Links
Moderators
Bucky Roberts Administrator