2016-01-18 2 views
1
char *strcat(char*dest, char*src) { 
    while (dest != '\0') { 
     *dest++; 
    } 
    while (src != '\0') { 
     *dest++ = *src++; 
    } 
    return dest; 
} 

Я продолжаю получать ошибку сегментации на линии *dest++ = *src++. Любые идеи по устранению проблемы?Char * strcat Реализация, ведущая к ошибке сегментации

+0

Вы хотите, чтобы проверить, значения, обозначенные 'dest' и' src', являются нулевыми терминаторами, а не самими указателями. Итак, 'while (* dest)' и 'while (* src)'. Также рассмотрим make 'src' указатель на const, например:' const char * src'. – szczurcio

+1

В дополнение к проблеме @szczurcio, вам нужно NULL-завершить строку 'dest', а также сохранить исходное значение' dest', чтобы оно могло быть возвращено. –

+1

Почему -1? Это может быть неправильный код, но проблема четко определена, с хорошо отформатированным образцом источника. –

ответ

2

Ваш код имеет 4 проблемы:

  • вы сравниваете указатели на нулевой символ, а не сравнивающие характер они указывают. Так как он будет увеличивать указатель очень много раз, прежде чем он станет 0, если вообще вы читаете и/или записываете за пределами буфера, от/до недопустимой памяти, прежде чем это произойдет, следовательно, сбой.
  • не удаляйте нулевую строку.
  • вы возвращаете указатель в конец строки назначения вместо исходной строки назначения. Это может быть полезным API, но для этого вы должны использовать другое имя.
  • Указатель src должен быть объявлен как const char *, чтобы соответствовать стандартным объявлениям для этой функции и разрешать прохождение указателей на постоянные строки в качестве источников.

Вот исправленный вариант:

char *strcat(char *dest, const char *src) { 
    char *saved = dest; 
    while (*dest != '\0') { 
     dest++; 
    } 
    while ((*dest++ = *src++) != '\0') { 
     continue; 
    } 
    return saved; 
} 
+0

это возвращает исходную строку, переданную как dest, без src concatenated –

+0

+1. Добавьте четвертую проблему, возможное переполнение буфера на 'dest', поскольку ничто не проверяет, достаточно ли выделенной памяти' dest'. –

+0

@ АлександрПогребняк: это часть API, о чем не жалуются. Вызывающий должен проверить это, а также гарантировать, что ни 'dest', ни' src' не являются нулевыми указателями. – chqrlie

1

dest и source никогда не станет '\0', если они не равны нулю, чтобы начать с (или, возможно, после того, как долгое время, чтобы быть правильным, но вы будете probalby запустить из памяти задолго до этого).

Вы должны использовать:

while(*dest != '\0'){ 
    dest++; 
} 
while(*src != '\0'){ 
    *dest++ = *src++; 
} 

проверить значения под указателями.

Есть некоторые другие проблемы:

  • результирующая строка не является нулем.

  • возвращается указатель на конец строки.

Как уже отмечалось другими: src должен быть const pointer тоже.

Это следует сделать это:

char *strcat(char *dest, const char *src) 
{ 
    char *start_pos = dest; 

    while(*dest != '\0') 
     dest++; 

    while(*src != '\0') 
     *dest++ = *src++; 

    *dest = '\0'; 
    return start_pos; 
} 

мелочью: Я бы дал этой FUNTION другое имя, чем стандарт, используемый strcat().

1

Хорошо: Kernighan путь:

char *strcat(char *dest, char *src) 
{ 
    char *org = dest; 
    while(*dest++){;} 
     // at this moment, *dest MUST be pointing to '\0' 
    while(*dest++ = *src++){;} 
     // at this moment, *dest MUST be pointing to '\0' agian 
    return org; 
} 

Update (courtously @chqrlie):

char *strcat(char *dest, char *src) 
{ 
    char *org = dest; 
    for(; *dest; dest++) {;} 
     // at this moment, dest MUST be pointing to '\0' 
    while(*dest++ = *src++) {;} 
     // at this moment, dest points past the '\0', but who cares? 
    return org; 
} 
+0

'while (* dest ++ = * srC++)' генерирует предупреждение, если вы компилируете с рекомендуемыми осторожными флагами. Лучше не играть смело дьявола и заключать в скобки это комбинированное назначение/тест. – chqrlie

+1

-1, потому что вы копируете исходную строку ** после ** нулевого терминатора целевой строки. Только инкремент 'dest', если' * dest! = '\ 0'' – chqrlie

+1

, не похвастайтесь таким образом, когда в коде есть большая ошибка в нем ';-)' C-программирование - это смущение, если вы не используете ' -Во время еще, вы не потратили достаточно времени на программирование в C. – chqrlie