В C89 я не могу создать массив символов из существующего - PullRequest
0 голосов
/ 15 октября 2018

Так что мой код разбивается на буфер [i] = envp [i].

Я хочу создать char ** буфер переменных среды и сделать их строчными (не добавлялputc (tolower ()) пока не зацикливается).Но когда я просто пытаюсь создать буфер [i] = envp [i], компилятор возвращает мне эту ошибку:

ошибка: присваивание делает целое число из указателя без буфера приведения [-Wint-преобразование][i] = envp [i];^

предупреждение: формат "% s" ожидает аргумент типа 'char *', но аргумент 2 имеет тип 'int' [-Wformat =] printf ("% s \ n", buffer [i]);~ ^ ~~~~~~~~~% d

int main(int argc, char *argv[], char * envp[])
{
    int i = 0;

    char *buffer = NULL;

    while(envp[i])
    {
        i++;
    }

    buffer = (char *)malloc(i * 8);


    for (i = 0; envp[i] != 0 ; i++)
    {
        buffer[i] = envp[i];
        printf("%s\n", envp[i]);
        printf("%s\n", buffer[i]);
    }

    return 0;

}

Пожалуйста, помогите, я тут ломаю голову :(. Большое спасибо !!!

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

buffer - неправильный тип для хранения массива строк.Он должен быть определен как:

char **buffer;

Кроме того, вы должны malloc сделать следующее:

buffer = malloc(i * sizeof(*buffer));

Использовать явно sizeof(*buffer) вместо магического числа 8, так как указательне гарантируется, что будет 8 байтов.Это также предпочтительнее sizeof(char *), поскольку оно не зависит от типа buffer Кроме того, не приводит к возвращаемому значению malloc.

, поскольку envзавершается указателем NULL, вы захотите сделать то же самое с buffer.Вам также следует скопировать строки с помощью strdup вместо простого копирования указателей, чтобы вы могли работать с отдельной копией:

char **buffer = malloc((i+1) * sizeof(*buffer));

for (i = 0; envp[i] != 0 ; i++)
{
    buffer[i] = strdup(envp[i]);
    printf("%s\n", envp[i]);
    printf("%s\n", buffer[i]);
}
buffer[i] = NULL;
0 голосов
/ 17 октября 2018

Спасибо, ребята за отзыв, я смог исправить свою функцию после комментариев здесь.Приветствия за помощь !!!

char **lower_env(int argc, char *argv[], char * envp[])
{
    int i = 0;
    int k = 0;
    int length = 0; /*Going to dictate lengths later on*/
/*creating the double buffer*/
char **buffer;

/* Finding the amount of elements in the environment array*/
while (envp[i])
{
    i++;
}

/* Allocate the memory for the Buffer to hold that amount of elements*/
buffer = calloc(i+1, (sizeof(char*)));


for (i = 0; envp[i] ; i++)
{

    length = strlen(envp[i]); /*Finding the length of each array pointed
                                at by the original environment array*/

    buffer[i] = calloc(length+1 , sizeof(char)); /*Allocating that memory space
                                                        within our buffer array*/


    /*copying over the arrays in lowercase pointed at by the env array to a new memory location
        pointed at by our new buffer array*/
    for (k = 0; k != length; k++)
    {
        buffer[i][k] = tolower (envp[i][k]);
    }
}

return buffer;
}
0 голосов
/ 15 октября 2018

char * envp[] - это массив указателей на символы, а не массив символов.И указатель (envp[i]) является целым числом.Когда вы пытаетесь присвоить его buffer[i] (который является символом), вы получаете предупреждение.

...