2010-07-31 3 views
1

В приведенном ниже коде в lesson2() я использовал пароль для ввода функции, но когда я ввожу функцию, которую она не берет в паспорте, и говорит неправильный пароль. Не принимая пароль, я хочу сказать, что я использовал, но его ждет, когда я буду вводить пароль.please, не скажите мне, чтобы я не использовал 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 и собирается вместе, создавая проблему!

+11

Не используйте добирается. И какую бы книгу вы ни учили писать код, подобный этому, сжечь его. –

+0

Я скучаю по myslef.Whats неправильно с моим кодом дорогой? –

+0

Можете ли вы опубликовать вывод, который видите? Я смущен в отношении точной проблемы, которую вы видите. – bpescatore

ответ

2

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

Решение:

scanf("%d",&choice); 
while(getchar() != '\n') { /*no nothing*/} 
+0

Ах! Я догадался правильно: D! Спасибо! –

+0

Но где эта новая строка, которую scanf пропускает? Я не понимаю, что новая строка пропускается scanf, поскольку я никогда не давал новую строку в качестве входа в scanf –

+1

@fahad: Да, вы сделали! Вы набрали «2», а затем [Enter]. Клавиша [Enter] вставляет символ '\ n'. – Clifford

-1

он должен работать. редактировать код:

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

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

+1

Это не ответ и, возможно, должен был быть просто комментарием. Более того, fahad было бы намного лучше использовать его отладчик исходного уровня компилятора, который печатает переменные. – Clifford

+0

@Clifford ... Из его вопроса я думаю, что он только начал я думаю, он не знал бы, как использовать отладчик –

+2

У меня нет отладчика. Я использую свой nerdy mind :( –

0

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

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

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

хотя в таком случае вы должны лучше исправить lesson1 функцию вместо этого.

2

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

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

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

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

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

+0

«% d \ n» будет работать только с введенным пользователем «2 ». Это они ввели «2abcdef », например, он все равно потерпит неудачу таким же образом. Я также предлагаю 'fgets (temp, sizeof (temp), stdin)', но это все еще не является прямой заменой для gets(), поскольку fgets() сохраняет '\ n', тогда как gets() отбрасывает его; поэтому для перезаписывания '\ n' с '\ 0' требуется дополнительный код. Все еще не сложно обернуть функцию, поэтому нет реального оправдания. – Clifford

Смежные вопросы