C 中无法在另一个函数中打印函数的返回值

标签 c arrays function function-call

我有一个名为 Login() 的函数,它读取用户名(例如“John”),然后创建一个密码,该密码是用户名本身,每个字母的大小写都是随机的(例如“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;
}

现在,当我在 main 中运行 Login() 时,我得到了

"Your password is : (null)"

如何解决这个问题?

最佳答案

主要问题:您的 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;
}

关于C 中无法在另一个函数中打印函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53912962/

相关文章:

mysql - 如何仅显示表中特定数量的数据

Javascript for 循环遍历数组列出名称和开头字母

c++ - 处理 boost 变量和 boost 函数

c - 隐式函数声明情况下的默认参数提升

c++ - mmap的长度是字节数还是页数?

C中的控制指令

javascript - 通过对象数组的 Angular 循环

Python:使用 allocate() 函数中的新列名称

c - 在哪里可以找到 -> 解引用运算符的源代码?

将简单循环转换为 do-while