получает не принимая пароль - PullRequest
1 голос
/ 01 августа 2010

В приведенном ниже коде в уроке 2 () я использовал пароль для входа в функцию, но когда я вхожу в функцию, она не принимает пароль и говорит неверный пароль. Не принимая пароль, я имею в виду, что Я использовал get, но он ждет, пока я введу пароль. Пожалуйста, не говорите мне, что не следует использовать get!

#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();
}

Я думаю, что это scanf и он вместе создает проблему!

Ответы [ 4 ]

2 голосов
/ 01 августа 2010

Ваша проблема в том, что до вызова get () вы звонили scanf("%d",&choice);main()). Проблема в том, что консольный ввод ориентирован на линию . Это означает, что, хотя вы ждете только ввода номера, пользователь должен ввести полную строку, заканчивающуюся новой строкой . Спецификатор формата% d потребляет только цифры, оставляющие остальную часть строки в буфере для использования при следующем входном вызове консоли; который в этом случае является get (), который видит новую строку в буфере и возвращает пустую строку без ожидания дальнейшего ввода.

Решение:

scanf("%d",&choice);
while(getchar() != '\n' ) { /*no nothing*/}
2 голосов
/ 01 августа 2010

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

Выполненный вами вызов scanf () ищет только «% d», а не «% d \ n».

Таким образом, вы вводите число 2, чтобы попробовать тест 2, и должны нажать Enter, прежде чем это значение попадет в программу. Поскольку scanf не пытается сопоставить его, эта новая строка остается частью входного потока и, таким образом, передается непосредственно в gets () в следующей функции.

Поэтому, если вы измените строку в scanf внутри главной функции, вы должны увидеть, как код начинает работать.

Теперь о другой заметке (и я знаю, что вы просили нас не делать этого, но ...), вы действительно не должны использовать get (). Чтобы переключиться на fgets, просто замените get (temp) на fgets (temp, 99, stdin). Это 99 - это любое число, которое меньше размера временного буфера, который вы создали, который в этом случае имеет размер 100.

0 голосов
/ 01 августа 2010

Попробуйте напечатать temp следующим образом: printf("[%s]\n", temp); после gets(temp);, чтобы увидеть, что сохраняется в temp. Может принимать в качестве входных данных предыдущий заданный вход из функции lesson1?

Если это так, возможно, что-то подобное решит проблему:

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

хотя в таком случае вам лучше вместо этого исправить lesson1.

0 голосов
/ 01 августа 2010

это должно сработать.отредактируйте ваш код:

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

и опубликуйте здесь результат

...