2017-02-02 2 views
1
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

void catTo(char *dest, const char *str1, const char *str2) 
{ 
    dest = (char *) malloc(1 + strlen(str1)+ strlen(str2)); 
    strcpy(dest, str1); 
    strcat(dest, str2); 
} 

int main(int argc, char** argv) { 
    char *str1 = "abcd"; 
    char *str2 = "defg"; 
    char *dest; 
    catTo(dest, str1, str2); 
    printf("%s",dest); 

    return 0; 
} 

Я пытаюсь получить простую функцию str-копирования для работы, однако, когда я распечатываю dest, я получаю «(null)». Я пробовал, возился с помещением &/* infront определенных переменных, но ни в коем случае не преобладал.Функция строки C с указателями, возвращающими нуль

+2

'недействительным Катто (CHAR * Dest,': 'dest' не будет изменен за пределами функции –

+0

при компиляции, всегда. включите все предупреждения, затем исправьте эти предупреждения (для 'gcc', при минимальном использовании:' -Wall -Wextra -pedantic' Я также использую: '-Wconversion -std = gnu99') – user3629249

+0

при вызове любой из кучной памяти функции распределения (malloc, calloc, realloc) 1) не выдают возвращаемое значение. Тип уже «void *», поэтому его можно назначить любому другому указателю. Кастинг просто загромождает код, что затрудняет его понимание, отладка, поддержку. 2) всегда проверяйте (! = NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно. – user3629249

ответ

4

не пропускает dest в качестве входного параметра. Его начальное значение не требуется (и не определено) и не изменено вызовом функции catTo, что объясняет вашу проблему.

Лучше это сделать:

char *catTo(const char *str1, const char *str2) 
{ 
    char *dest = malloc(1 + strlen(str1)+ strlen(str2)); 
    strcpy(dest, str1); 
    strcat(dest, str2); 
    return dest; 
} 

и в вызывающем:

char *dest = catTo(str1, str2); 
+0

Вы имели в виду 'char dest = /*...*/'in' catTo'? –

+0

конечно !! исправлено. –

4

Я пытался, возиться с проставлением &/* линии всасывания некоторых переменных, но не преобладают.

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

Несмотря на это, проблема в том, что вы передаете dest как char* и затем сопоставляя dest внутри catTo: так как вы копируете dest, вы присваиваете к локальному аргументу, а не к dest, например, присутствующим в main ,

Вы можете решить эту проблему, передавая dest как char**:

void catTo(char **dest, const char *str1, const char *str2) 
{ 
    *dest = malloc(1 + strlen(str1)+ strlen(str2)); 
    strcpy(*dest, str1); 
    strcat(*dest, str2); 
} 

int main(int argc, char** argv) { 
    char *str1 = "abcd"; 
    char *str2 = "defg"; 
    char *dest; 
    catTo(&dest, str1, str2); 
    printf("%s",dest); 

    return 0; 
} 

Кроме того, каждый malloc должны соответствовать соответствующим free. Не забудьте позвонить free(dest), когда вы сделали с ним в main:

int main(int argc, char** argv) { 
    char *str1 = "abcd"; 
    char *str2 = "defg"; 
    char *dest; 
    catTo(&dest, str1, str2); 
    printf("%s",dest); 
    free(dest); 

    return 0; 
} 
+1

нет необходимости в том, что char * cast in malloc: '(char *) malloc' =>' malloc' –

+0

@ Jean-FrançoisFabre: хорошо, удалил его. –

+0

@ Jean-FrançoisFabre все еще не уровень мягкости Javascript, но довольно близко! – Quentin

Смежные вопросы