我有一个名为Login()的函数,该函数读取用户名(例如"John"
),然后创建一个密码,该密码就是用户名本身,每个字母随机上下(例如"JoHn"
) )添加到名为password()
的新函数中。但是,当我尝试将Login()中的密码作为password()
的返回语句打印时,它会输出null;
这是返回密码的功能:
void Login()
{
char passwd[20];
char name[20];
printf(" Please enter your username : \n");
do
{
scanf(" %s",&name);
}while(strcmp(name,"John")!=0);
printf("Your password is : %s\n",password(name));
printf("Please enter your password : \n");
do
{
scanf(" %s",&passwd);
}while(strcmp(passwd,password(name))!=0);
}
这是返回密码的函数:
char password( char pass[])
{
int i;
int k;
for(i=0;i<strlen(pass);i++)
{
k= rand()%2;
if(k==1)
{
pass[i]=toupper(pass[i]);
}
else{
pass[i]=tolower(pass[i]);
}
}
return pass;
}
现在,当我在Login()
中运行main
时,我会得到
“您的密码为:(空)”
如何解决此问题?
答案 0 :(得分:2)
主要问题:password()
函数实际上返回一个char
,而它应该返回一个指向char
数组的第一个元素的指针(已修改)。
也就是说,还有其他问题。
您多次调用password(name)
(在do...while
循环中),而您的输入应该根据第一次调用的结果进行验证。像在每次调用中一样,返回的字符串是随机的,连续的调用将返回不同的结果。您需要存储第一次调用的结果,并将输入结果与之进行比较。
scanf(" %s",&name);
应该为scanf("%19s",name);
,因为
19
将对输入进行长度限制,以避免可能的缓冲区溢出。&
。也与密码输入相同。
编辑:
这是该代码的有效版本:Live version
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char* password( char pass[])
{
int i;
int k;
for(i=0;i<strlen(pass);i++)
{
k= rand()%2;
if(k==1)
{
pass[i]=toupper(pass[i]);
}
else{
pass[i]=tolower(pass[i]);
}
}
return pass;
}
int main(void)
{
char passwd[20];
char name[20];
printf(" Please enter your username : \n");
do
{
scanf("%19s",name);
}while(strcmp(name,"John")!=0);
char * res = password(name);
printf("Your password is : %s\n",res);
do
{
printf("Please enter your password : \n");
scanf("%19s",passwd);
}while(strcmp(passwd,res)!=0);
return 0;
}