无法在 C 中的另一个函数中打印函数的 return 值
Cannot print a function's return value in another function in C
我有一个名为 Login() 的函数,它读取用户名(例如 "John"
),然后创建一个密码,该密码是用户名本身,每个字母的大小写随机(例如 "JoHn"
) 在一个名为 password()
的新函数中。但是,当我尝试在 Login() 中将密码打印为来自 password()
的 return 语句时,它会打印 null;
这是return密码的功能:
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);
}
这是 return 密码的功能:
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
我得到
"Your password is : (null)"
我该如何解决这个问题?
主要问题:您的 password()
函数实际上 return 一个 char
,而它应该 return 一个指向 [=12] 的第一个元素的指针=]数组(修改后的一个).
也就是说,还有其他问题。
您多次调用 password(name)
(在 do...while
循环中),而您的输入应该根据第一次调用的结果进行验证。在每次调用中,returned 字符串是随机的,连续调用将 return 不同的结果。您需要存储第一次调用的结果并将输入与其进行比较。
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;
}
我有一个名为 Login() 的函数,它读取用户名(例如 "John"
),然后创建一个密码,该密码是用户名本身,每个字母的大小写随机(例如 "JoHn"
) 在一个名为 password()
的新函数中。但是,当我尝试在 Login() 中将密码打印为来自 password()
的 return 语句时,它会打印 null;
这是return密码的功能:
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);
}
这是 return 密码的功能:
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
我得到
"Your password is : (null)"
我该如何解决这个问题?
主要问题:您的 password()
函数实际上 return 一个 char
,而它应该 return 一个指向 [=12] 的第一个元素的指针=]数组(修改后的一个).
也就是说,还有其他问题。
您多次调用
password(name)
(在do...while
循环中),而您的输入应该根据第一次调用的结果进行验证。在每次调用中,returned 字符串是随机的,连续调用将 return 不同的结果。您需要存储第一次调用的结果并将输入与其进行比较。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;
}