tags:

views:

73

answers:

4

In the code below in lesson2() i have used a password to enter the function but when i enter the function it does not takes in the passord and says incorrect password.By not taking in the password,i mean to say that i have used gets but its waiting for me to input a password.please dont tell me not to use gets!

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<dos.h>
int mistakes=0,mistakes_length,len;
char temp[100];
void lesson1(void);
void lesson2(void);
void result(void);
void main(void)
{
    int choice;
    clrscr();
    printf("Enter a lesson number to practise:1-10 \n");
    scanf("%d",&choice);
    switch(choice)
    {
        case 1:
        lesson1();
        result();
        break;
        case 2:
        lesson2();
        result();
        break;
        default:
        printf("You did not entered a valid choice program quitting..\n");
        exit(0);
    }
    getch();
}
void lesson1(void)
{
    int i;
    char str1[100]="testing the typing tutor if it works";
    mistakes_length=5;
    clrscr();
    gotoxy(25,2);
    puts("Welcome to lesson 1");
    puts(str1);
    len=strlen(str1);
    for(i=0;i<len;i++)
    {
        temp[i]=getche();
        if(strncmpi(&str1[i],&temp[i],1))//does not match
        {
            mistakes++;
            sound(100);
            delay(1000);
            nosound();

        }
    }
    getch();
}
void result(void)
{
    printf("Your statsistics are as under:\nYou performed this lesson with %d mistakes\n",mistakes);
    if(mistakes>=mistakes_length)
        {
                printf("\n Your typing is very bad");//allow anything to be typed with any mistake in lesson 1

        }
        if(mistakes>3&&mistakes<5)
        {
            printf("Bad!,You need to practise this excercise more\n");
        }
        if(mistakes>=1&&mistakes<=3)
        {
            printf("Good!you can still do better\n");
        }
        if(mistakes==0)
        {
            printf("Excellent!You are qualified for the next lesson\n");
            printf("The next lessons password is \n\t\t\t:12345");
        }
}

void lesson2(void)
{
    char password[]="12345",str2[]="My name is khan and i am not a criminal";
    int i;
    mistakes=0,mistakes_length=0,
    printf("Enter password:\n");
    gets(temp);
    if(strcmp(temp,password))
    {
        gotoxy(20,25);
        printf("Wrong Password,Program Quitting.\n");
        getch();
        exit(1);
    }
    gotoxy(25,25);
    printf("Password Accpted!");
    getch();
    clrscr();
    gotoxy(25,2);
    printf("Welcome to lesson 2\n");
    printf("Type the text shown below:\n");
    puts(str2);
    len=strlen(str2);
    for(i=0;i<len;i++)
    {
        temp[i]=getche();
        if(strncmp(&str2[i],&temp[i],1));
        {
            mistakes++;
        }

    }
    getch();
}

I think that it is the scanf and gets together making a problem!

A: 

it supposed to work. edit your code:

int r = gets(temp);
printf("returned: %d, Entered: %s\n", r, temp);

and post here the result

Moisei
That is not an answer and perhaps should have been just a comment. Moreover, fahad would be far better off using his compiler's source level debugger that printing out variables.
Clifford
@Clifford ... From his question I think he just started learning, so I guess he wouldn't know how to use a debugger
i dont have a debugger.I use my nerdy mind :(
fahad
@fahad: What compiler are you using? Looks like a Borland library, all Borland C/C++ compilers since Turbo C++ 1.01 in 1991 included a debugger. There are more modern free compilers that have far better debuggers - no excuses.
Clifford
I dont have a very good idea about debugging.I searched many a times but did not found any debugger.I use borland turbo c 3
fahad
@fahad: There is no such thing as Turbo C 3; there was a Turbo C++ 3.0 (released in 1991). I Googled a screen shot of the IDE and can clearly see "Debug" in the menu strip. That is where to start. You can also run Turbo Debugger stand-alone.
Clifford
A: 

Try printing temp like this: printf("[%s]\n", temp); after the gets(temp); to see what is saved in temp. It may takes as input a previous given input from lesson1 function?

If this is the case, something like this maybe will fix the problem:

char other_tmp[5];
gets(other_tmp);
gets(temp);

although in such a case you should better correct the lesson1 function instead.

+2  A: 

I think the problem you are seeing is in fact coming from the main method.

The scanf() call that you make is only looking for "%d" rather than "%d\n".

Therefore, you enter the number 2 in order to try test 2, and must press enter before that value gets to the program. Since scanf is not trying to match it, that newline remains as part of the input stream and thus is passed directly to gets() within the next function.

Therefore, if you change the string within scanf inside the main function, you should see the code start working.

Now on another note (and I know that you asked us not to but...) you really shouldn't use gets(). In order to switch to fgets, just replace gets(temp) with fgets(temp,99,stdin). That 99 is any number that is less than the size of the temp buffer you have made, which in this case has size 100.

bpescatore
"%d\n" would only work is the user entered "2<newline>". It they entered "2abcdef<newline>" for example it would still fail in the same way. I'd also suggest `fgets(temp,sizeof(temp),stdin)`, but that is still not a direct replacement for gets() since fgets() retains the '\n', whereas gets() discards it; so additional code is required to overwrite the '\n' with '\0'. Still not hard to wrap in a function so there is no real excuse.
Clifford
+2  A: 

Your problem is that prior to calling gets(), you have called scanf("%d",&choice); (in main()). The problem with this is that console input is line oriented. This means that although you are only waiting for a number to be entered the user has to enter a complete line ending in newline. The %d format specifier only consumes the digit characters leaving the rest of the line in the buffer to be used by the next console input call; which in this case is gets() which sees the newline in the buffer and returns an empty string without waiting for further input.

A solution:

scanf("%d",&choice);
while(getchar() != '\n' ) { /*no nothing*/}
Clifford
Ahh! i guessed right :D ! ThankYou!
fahad
But where is that new line which scanf skips? I dont get that a new line is skipped by scanf as i never gave a newline as input in scanf
fahad
@fahad: Yes you did! You typed "2" followed by [Enter]. The [Enter] key inserts a '\n' character.
Clifford