реализация strcat - PullRequest
       3

реализация strcat

7 голосов
/ 21 марта 2010

Я пытался реализовать strcat самостоятельно, и нашел реализацию strcat из Wiki вот так ...... но когда я ее использую, возникает ошибка сегментации.

Что не так с кодом ниже?

char *
strcat(char *dest, const char *src)
{
    size_t i,j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}

Ответы [ 5 ]

14 голосов
/ 21 марта 2010

код в порядке.

Похоже, у вас проблема с кодом вызова.

Вы не забыли выделить достаточно памяти для целевой строки?

8 голосов
/ 22 марта 2010

Я бы настоятельно рекомендовал использовать указатели, а не целочисленные индексы, опасаясь переполнения целых чисел. Даже если size_t - это то же количество бит, что и char *, вы добавляете индексы там, где вы не добавляете указатели.

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

Вот для справки версия на основе указателя:

char *
my_strcat(char *dest, const char *src)
{
    char *rdest = dest;

    while (*dest)
      dest++;
    while (*dest++ = *src++)
      ;
    return rdest;
}

Конечно, для возвращаемого значения rdest требуется место другого указателя, но я думаю, что это хороший компромисс.

Также обратите внимание, что вы не можете юридически определить функцию с именем strcat() в обычном коде приложения; все пространство имен (публичные функции с именами, начинающимися с str) зарезервировано для реализации.

3 голосов
/ 21 марта 2010

dest должен иметь достаточно памяти для размещения конкатенации в этой реализации. В этой реализации он должен быть выделен вызывающей стороной. Вы также должны быть уверены, что как dest, так и src имеют нулевое завершение. Если у dest недостаточно памяти, это перезапишет память, которую может использовать что-то другое.

0 голосов
/ 10 сентября 2013

Выделите достаточно памяти для строки назначения .. т.е. по крайней мере (длина строки источника + 1).

0 голосов
/ 22 марта 2010

Со мной все работает, я проверю.

    #include "stdio.h"


    char *strcat(char *dest, const char *src)

    {

    size_t i,j;

    for (i = 0; dest[i] != '\0'; i++)

        ;

    for (j = 0; src[j] != '\0'; j++)

        dest[i+j] = src[j];

    dest[i+j] = '\0';

    return dest;

}


void main(void)

{

    char a[10]={"abc"}, b[10]={"def"};

    strcat(a,b);

    printf("%s",a);

    getchar();

}
...