1

在下面第 2 课()的代码中,我使用了密码进入函数,但是当我进入函数时,它没有输入密码并说密码不正确。不输入密码,我的意思是说我已经使用了获取但它在等待我输入密码。请不要告诉我不要使用获取!

#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”而不是“%d\n”。

因此,您输入数字 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 回答