在第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并聚在一起制造问题!
答案 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);
并在此处发布结果