得不到密码

时间:2010-07-31 21:49:10

标签: c fgets

在第2课()中的代码中,我使用了密码来输入功能,但是当我输入功能时,它不会输入密码并说错误的密码。不接受密码,我的意思是说我已经使用了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 个答案:

答案 0 :(得分:2)

我认为您看到的问题实际上来自主要方法。

你所做的scanf()调用只是寻找“%d”而不是“%d \ n”。

因此,您输入数字2以尝试测试2,并且必须在该值到达程序之前按Enter键。由于scanf没有尝试匹配它,该换行符仍然是输入流的一部分,因此在下一个函数中直接传递给gets()。

因此,如果更改main函数内scanf中的字符串,您应该会看到代码开始工作。

现在另一个注意事项(我知道你问我们不要......)你真的不应该使用gets()。要切换到fgets,只需用fgets(temp,99,stdin)替换gets(temp)。 99是任何小于您所设置的临时缓冲区大小的数字,在这种情况下大小为100。

答案 1 :(得分:2)

您的问题是,在调用gets()之前,您已调用scanf("%d",&choice);(在main()中)。这个问题是控制台输入是面向行的。这意味着虽然您只是在等待输入数字,但用户必须输入以换行符结尾的完整行。 %d格式说明符仅使用数字字符,而缓冲区中的其余行将由下一个控制台输入调用使用;在这种情况下,gets()在缓冲区中看到换行符并返回空字符串而不等待进一步输入。

解决方案:

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

答案 2 :(得分:0)

尝试在printf("[%s]\n", temp);之后打印这样的临时温度:gets(temp);,以查看temp中保存的内容。它可能需要lesson1函数的先前给定输入作为输入?

如果是这种情况,这样的事情可能会解决问题:

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

虽然在这种情况下你应该更好地纠正lesson1函数。

答案 3 :(得分:-1)

它应该有效。 编辑你的代码:

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

并在此处发布结果