Невозможно напечатать возвращаемое значение функции в другой функции в C - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть функция с именем Login (), которая читает имя пользователя (например, "John"), а затем создает пароль, который является самим именем пользователя, причем каждая буква заглавная или верхняя или нижняя (например, "JoHn") внутри новоговызывается функция password(). Однако когда я пытаюсь напечатать пароль в Login () как оператор возврата из password(), он печатает ноль;

Это функция, которая возвращает пароль:

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, я получаю

"Ваш пароль:(null) "

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 24 декабря 2018

Основная проблема: ваша функция password() фактически возвращает char, тогда как она должна возвращать указатель на первый элемент массива char (модифицированный).

Это сказалоЕсть и другие проблемы.

  • Вы вызываете password(name) несколько раз (в цикле do...while), тогда как ваш ввод должен быть проверен по результатам первого вызова.Как и при каждом вызове, возвращаемая строка рандомизируется, последующие вызовы будут возвращать разные результатыВам нужно сохранить результат первого вызова и сравнить входные данные с ним.

  • scanf(" %s",&name); должно быть scanf("%19s",name);, потому что

    • The 19 будет ограничивать длину ввода, избегая возможных переполнений буфера.
    • Тип массива, в большинстве случаев, автоматически уменьшается до типа как указатель на первый элемент - использование & не требуется.

    То же самое для ввода пароля.


РЕДАКТИРОВАТЬ:

Вот рабочая версия кода: Liveверсия

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...