关于数组和if循环函数的一个小疑点
关于数组和if循环函数的一个小问题
void xuanze()
{
int i;
char temp1[N],temp2[N],temp3[N],yhmtmp[N];
char s1[N],s2[N];
printf("-----------\n1.注册\n2.登陆\n0.退出\n");
scanf("%d",&i);
system("cls");
if(i==1)
{
printf("输入用户名\n");
fflush(stdin);//清空缓存
gets(yhmtmp);
printf("输入密码\n");
fflush(stdin);
gets(temp1);
printf("输入密码确认\n");
fflush(stdin);
gets(temp2);
if(!strcmp(temp1,temp2))
{
system("cls");
printf("注册成功\n");
xuanze();
}
else
{
printf("两次输入不一致,输入密码确认\n");
gets(temp3);
if(!strcmp(temp1,temp3))
{ system("cls");
printf("注册成功\n");
}
xuanze();
}
}
else if(i==2)
{
printf("输入用户名\n");
fflush(stdin);
gets(s1);
printf("输入密码\n");
fflush(stdin);
gets(s2);
if(!strcmp(s1,yhmtmp))
if(!strcmp(s2,temp1))
printf("登陆成功\n");
else
{system("cls");printf("密码错误\n");xuanze();}
else
{printf("用户名不存在\n");xuanze();
}
}
else if(i==0)
{
Quit();
}
}
这个小程序的登录系统在判断用户名和密码的时候产生了错误,不管怎么输入都会是永假。感觉要么是之前注册的用户名和密码根本没有存到数组里,那个比较没意义,要么就是判断的方式有问题。请大家看看~~(可能会有一些括号什么的问题,应该是修改后忘了加什么的。是能运行的。。就是没效果
------解决方案--------------------
要善于调试。
------解决方案--------------------
不是你说的 ”感觉要么是之前注册的用户名和密码根本没有存到数组里,那个比较没意义,要么就是判断的方式有问题。“
这种问题,而是你一些基础知识没有打扎实:
原因就在 你没有注意那些 char 变量的作用范围是哪里,char在xuanze()这个函数内部定义的,也就是说他的变量的作用域是函数内部,详细解释一下:
在你选择了1后,写入用户名和密码后,它就将这些信息全部存入char这些数组变量中,然后会怎样,你又调用了xuanze()这个函数,相当于你在函数内部递归了xuanze()函数,同样它会在这个嵌套的xuanze()内部在定义一次char 数组这些变量,和外面那个xuanze()函数定义的是同名char变量,这些都是局部变量,但是外层的char 数组已经在注册过程中已经赋值,但是嵌套的xuanze()函数内部重新定义的char 数组变量中用户名和密码根本就没赋值,相当于在嵌套xuanze()内部你只完成了登录过程,完成的是s1,s2登录过程中的赋值,然后他会将这些信息和在嵌套的xuanze()函数内部定义的yhmtmp和tmp1作比较,但是嵌套xuanze()函数的yhmtmp个tmp1根本没有赋值,肯定会用户名和密码不匹配的情况:
解决方法:
把那些局部变量char数组和 int全部定义为全局变量,放在函数外部定义,就能通过了,我试过了,能得到你要的结果。
void xuanze()
{
int i;
char temp1[N],temp2[N],temp3[N],yhmtmp[N];
char s1[N],s2[N];
printf("-----------\n1.注册\n2.登陆\n0.退出\n");
scanf("%d",&i);
system("cls");
if(i==1)
{
printf("输入用户名\n");
fflush(stdin);//清空缓存
gets(yhmtmp);
printf("输入密码\n");
fflush(stdin);
gets(temp1);
printf("输入密码确认\n");
fflush(stdin);
gets(temp2);
if(!strcmp(temp1,temp2))
{
system("cls");
printf("注册成功\n");
xuanze();
}
else
{
printf("两次输入不一致,输入密码确认\n");
gets(temp3);
if(!strcmp(temp1,temp3))
{ system("cls");
printf("注册成功\n");
}
xuanze();
}
}
else if(i==2)
{
printf("输入用户名\n");
fflush(stdin);
gets(s1);
printf("输入密码\n");
fflush(stdin);
gets(s2);
if(!strcmp(s1,yhmtmp))
if(!strcmp(s2,temp1))
printf("登陆成功\n");
else
{system("cls");printf("密码错误\n");xuanze();}
else
{printf("用户名不存在\n");xuanze();
}
}
else if(i==0)
{
Quit();
}
}
这个小程序的登录系统在判断用户名和密码的时候产生了错误,不管怎么输入都会是永假。感觉要么是之前注册的用户名和密码根本没有存到数组里,那个比较没意义,要么就是判断的方式有问题。请大家看看~~(可能会有一些括号什么的问题,应该是修改后忘了加什么的。是能运行的。。就是没效果
------解决方案--------------------
要善于调试。
------解决方案--------------------
不是你说的 ”感觉要么是之前注册的用户名和密码根本没有存到数组里,那个比较没意义,要么就是判断的方式有问题。“
这种问题,而是你一些基础知识没有打扎实:
原因就在 你没有注意那些 char 变量的作用范围是哪里,char在xuanze()这个函数内部定义的,也就是说他的变量的作用域是函数内部,详细解释一下:
在你选择了1后,写入用户名和密码后,它就将这些信息全部存入char这些数组变量中,然后会怎样,你又调用了xuanze()这个函数,相当于你在函数内部递归了xuanze()函数,同样它会在这个嵌套的xuanze()内部在定义一次char 数组这些变量,和外面那个xuanze()函数定义的是同名char变量,这些都是局部变量,但是外层的char 数组已经在注册过程中已经赋值,但是嵌套的xuanze()函数内部重新定义的char 数组变量中用户名和密码根本就没赋值,相当于在嵌套xuanze()内部你只完成了登录过程,完成的是s1,s2登录过程中的赋值,然后他会将这些信息和在嵌套的xuanze()函数内部定义的yhmtmp和tmp1作比较,但是嵌套xuanze()函数的yhmtmp个tmp1根本没有赋值,肯定会用户名和密码不匹配的情况:
解决方法:
把那些局部变量char数组和 int全部定义为全局变量,放在函数外部定义,就能通过了,我试过了,能得到你要的结果。