1

以下のlesson2()のコードでは、関数を入力するためにパスワードを使用しましたが、関数を入力すると、パスワードが取り込まれず、間違ったパスワードが表示されます。パスワードを取り込まないことで、使用したと言う意味ですgets でもパスワードを入力するのを待っています。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();
}

scanf だと思いますし、一緒に問題を作ってます!

4

4 に答える 4

2

あなたが見ている問題は、実際にはメインの方法に起因していると思います。

行うscanf()呼び出しは、「%d \ n」ではなく「%d」のみを検索します。

したがって、テスト2を試すには、数値2を入力し、その値がプログラムに到達する前にEnterキーを押す必要があります。scanfはそれに一致させようとしないため、その改行は入力ストリームの一部として残り、次の関数内のgets()に直接渡されます。

したがって、main関数内のscanf内で文字列を変更すると、コードが機能し始めるのがわかります。

さて、別の注意点として(そして、あなたが私たちにそうしないように頼んだことを私は知っていますが...)あなたは本当にgets()を使うべきではありません。fgetsに切り替えるには、gets(temp)をfgets(temp、99、stdin)に置き換えるだけです。その99は、作成した一時バッファーのサイズ(この場合はサイズ100)よりも小さい任意の数値です。

于 2010-07-31T22:12:52.980 に答える
2

問題は、gets()を呼び出す前に、scanf("%d",&choice);(in main())を呼び出したことです。これに伴う問題は、コンソール入力が行指向であるということです。つまり、番号が入力されるのを待っているだけですが、ユーザーは改行で終わる完全な行を入力する必要があります。%d形式指定子は、次のコンソール入力呼び出しで使用されるように、残りの行をバッファーに残して数字文字のみを消費します。この場合はgets()で、バッファ内の改行を確認し、それ以上の入力を待たずに空の文字列を返します。

解決策:

scanf("%d",&choice);
while(getchar() != '\n' ) { /*no nothing*/}
于 2010-07-31T22:18:20.883 に答える
0

次のように temp を印刷してみprintf("[%s]\n", temp);gets(temp);くださいtemp。関数からの前の入力を入力として受け取ることができますlesson1か?

この場合、次のような方法で問題が解決する可能性があります。

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

ただし、そのような場合は、lesson1代わりに関数を修正する必要があります。

于 2010-07-31T21:57:29.770 に答える
-1

それはうまくいくはずです。コードを編集します。

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

ここに結果を投稿します

于 2010-07-31T21:56:17.670 に答える