Объединить константный символ в символьный - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь сгенерировать пароли и скопировать их в строку. Вот что я хочу сделать:

char generatePassword(int npasswords) {
    int i, z;
    char c, fullPw[300];

    for(z = 0; z < npasswords; z++) {
        for (i = 0; i < 3; ++i) {
            c = rand() % 23 + 'a';
            strcpy(fullPw, c); // ERROR HERE
            printf("%c", c);
        }
        for (i = 0; i < 3; ++i) {
            c = rand() % 23 + 'A';
            printf("%c", c);
            strcat(fullPw, c);
        }
        for (i = 0; i < 3; ++i) {
            c = rand() % 9 + '1';
            printf("%c", c);
            strcat(fullPw, c);
        }
        for (i = 0; i < 4; ++i) {
            c = rand() % 10 + '!';
            printf("%c", c);
            strcat(fullPw, c);
            strcat(fullPw, "\n");
        }
    }
    return fullPw;
}

Я получаю ошибку

Неправильное преобразование из 'char' в 'const char *'

Кто-нибудь может помочь, как это исправить?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

strcpy() и strcat() - это функции, которые работают с «строками». Один char не является строкой (в C).

strcpy(), а также strcat() принимают указатели на 1-й элемент char -определенного массива *1009* (который вфакт, что C использует в качестве того, что другие языки называют «строкой»).

Код, который вы показываете, не передает это для второго аргумента функций, а передает только один char.

Что касается сообщения об ошибке.

Чтобы исправить это, есть несколько подходов.

Чтобы использовать функции, работающие со строками, нужно как-то сделать char добавить строку. Это можно сделать с помощью составного литерала, например, так:

    strcpy(fullPw, (char[2]){c});

Этот (char)[2] определяет безымянную переменную типа char[2], инициализирует 1-й элемент в c и неявно инициализирует 2-й элемент в'\0'. Который в целом является "строкой" размером в 1 символ. Передача в strcpy() приводит к распаду по адресу 1-го элемента, в char*.

То же самое для strcat().

Кстати, этот strcat(fullPw, "\n"); используется правильноas "\n" - строковый литерал, который определяет массив из 2 символов, для 1-го элемента установлено значение '\ n', а для 2-го - '\0'. Следуя вышеприведенному подходу, это также можно записать как strcat(fullPw, (char[2]){'\n'});

Также обратите внимание, что время жизни таких «неназванных» переменных является текущей областью действия. Поэтому, если вы хотите убедиться, что они были освобождены сразу после их использования, то есть внутри вызываемых функций, то заключите эти вызовы в свою область видимости, например, так:

    {
      strcpy(fullPw, (char[2]){c});
    }
0 голосов
/ 13 октября 2019

сначала при компиляции всегда включайте предупреждения, затем исправляйте их.

Для gcc при минимальном использовании: -Wall -Wextra -Wconversion -pedantic -std=gnu11

Примечание: другие компиляторы используют разные опции для получения одинакового результата.

Компиляция с включенными предупреждениями результатовв:

gcc    -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11  -c "untitled.c"  (in directory: /home/richard/Documents/forum)
untitled.c: In function ‘generatePassword’:
untitled.c:12:17: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
             c = rand() % 23 + 'a';
                 ^~~~
untitled.c:13:28: warning: passing argument 2 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
             strcpy(fullPw, c); // ERROR HERE
                            ^
In file included from untitled.c:2:0:
/usr/include/string.h:121:14: note: expected ‘const char * restrict’ but argument is of type ‘char’
 extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
              ^~~~~~
untitled.c:17:17: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
             c = rand() % 23 + 'A';
                 ^~~~
untitled.c:19:28: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [-Wint-conversion]
             strcat(fullPw, c);
                            ^
In file included from untitled.c:2:0:
/usr/include/string.h:129:14: note: expected ‘const char * restrict’ but argument is of type ‘char’
 extern char *strcat (char *__restrict __dest, const char *__restrict __src)
              ^~~~~~
untitled.c:22:17: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
             c = rand() % 9 + '1';
                 ^~~~
untitled.c:24:28: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [-Wint-conversion]
             strcat(fullPw, c);
                            ^
In file included from untitled.c:2:0:
/usr/include/string.h:129:14: note: expected ‘const char * restrict’ but argument is of type ‘char’
 extern char *strcat (char *__restrict __dest, const char *__restrict __src)
              ^~~~~~
untitled.c:27:17: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
             c = rand() % 10 + '!';
                 ^~~~
untitled.c:29:28: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [-Wint-conversion]
             strcat(fullPw, c);
                            ^
In file included from untitled.c:2:0:
/usr/include/string.h:129:14: note: expected ‘const char * restrict’ but argument is of type ‘char’
 extern char *strcat (char *__restrict __dest, const char *__restrict __src)
              ^~~~~~
untitled.c:33:12: warning: return makes integer from pointer without a cast [-Wint-conversion]
     return fullPw;
            ^~~~~~
untitled.c:33:12: warning: function returns address of local variable [-Wreturn-local-addr]
Compilation finished successfully.

также отправленный код, даже после устранения вышеуказанных проблем, не будет компилироваться, поскольку в нем отсутствуют операторы:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

Примечание: только потому, что списокпредупреждения компилятора заканчиваются на:

Compilation finished successfully.

НЕ означает, что код правильный. Это просто означает, что компилятор смог включить какой-то обходной путь для каждой из проблем в коде. Обычно результат НЕ тот, который вы намеревались

Кроме того, функции: rand() должна предшествовать, обычно в верхней части main() функция посредством вызова: srand(), аналогичного:

#include <time.h>
...
int main( void )
{
    ...
    srand( (unsigned)time( void ) );

для инициализации последовательности случайных чисел случайным значением

настоятельно рекомендуем прочитать / понять страницы MAN для функций, которые вызывает ваша программа

...