Функция для добавления строк, возвращающих указатель / ошибку приведения - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь создать функцию, которая принимает две строки ввода dest и src и добавляет строку src к строке dest.

Ниже приведена текущая функция, которая у меня есть.Однако, когда я пытаюсь использовать его, я получаю сообщение об ошибке «возвращение char из функции без приведения».Я понимаю, что моя ошибка связана с оператором return и с тем, как я использую его в качестве указателя, но я не уверен, как это исправить.

char* strcat(char dest[], char src[]) {
    int destL = lenstr(dest);
    int srcL = lenstr(src);
    char result[destL + srcL];

    int i;
    for(i = 0; i < destL; i++){
        result[i] = dest[i];
    }

    for(i = destL; i < destL+srcL; i++){
        result[i] = src[i-destL];
    }

    return *result;
}

Функция lenstr:

int lenstr(char* s) {
    int len = 0;
    while(s[len++] != '\0');
    return len-1;
}

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Однако, когда я пытаюсь использовать его, я получаю сообщение об ошибке «возвращая char» из функции без приведения ».

Эта ошибка просто означает, что возвращаемое значение не соответствует объявлению функции.В своем объявлении функции вы упомянули, что он возвращает char *.Однако в вашем фактическом операторе return вы возвращаете *result, который является разыменованным указателем на символ, то есть char.

Вторая проблема в вашем коде заключается в том, что вы возвращаете массив из функции.Память, выделенная с использованием массива в методе, становится недоступной для метода вызывающей стороны.Вам необходимо создать память в куче и вернуть указатель на нее, а затем позволить вызывающей стороне освободить память после использования.

Извлечь следующий рабочий код:

char* strcat1(char dest[], char src[]) {
    int destL = lenstr(dest);
    int srcL = lenstr(src);

    char * result = malloc(sizeof(char) * (destL + srcL));

    int i;
    for(i = 0; i < destL; i++){
        result[i] = dest[i];
    }

    for(i = destL; i < destL+srcL; i++){
        result[i] = src[i-destL];
    }

    return result;
}

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

char * result = strcat1("hi", "ho");
printf(result);
free(result);
0 голосов
/ 24 февраля 2019

Вы не можете вернуть локально объявленный массив.Ну, вы можете, но данные могут быть перезаписаны в любое время, так как они больше не действительны.

Вам нужно сделать что-то вроде этого:

char* strcat(char dest[], char src[]) {
    char * result = malloc((lenstr(dest)+lenstr(src)+1) * sizeof *result);

    // Code to copy data

    return result;
}

Обратите внимание, что +1важно освободить место для терминатора \0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...