2010-07-25 2 views
1

Я написал программу для конкатенации двух строк, и она бросает ошибку сегментации во время выполнения в строке s1 [i + j] = s2 [j], in for loop ..... И i я не в состоянии понять, почему это происходит так .... Просьба координировать меня, где я иду не так.программа конкатенации в C

char* concatenate(char *s1, char *s2) 
{ 
    int i,j=0; 

    for(i=0; s1[i] != '\0'; i++); 
    for(j=0; s2[j] != '\0'; j++) 
    { 
     s1[i+j] = s2[j]; 
    } 
    s1[i+j] = s2[j]; 

    return s1; 
} 

char *s1 = (char *) malloc(15);; 
    char *s2 ; 

    s1 = "defds"; 
    s2 = "abcd"; 

    s1 = concatenate(s1,s2); 
// printf("\n\n%s\n\n",s1); 
+1

Для того, чтобы кто-либо мог ответить на этот вопрос, вам нужно показать функцию, которая _calls_ эта функция. –

+3

@James прав, и немного глупо, что несколько плакатов прыгали в поиске всех видов ошибок с 'concatenate', которые (1) являются точно такими же проблемами, что и' strcat', и (2) не имеют ничего общего с выдаёт ошибку сегментации. –

+0

@John: Запись функции замены strcat бесполезна, если ваша функция имеет те же недостатки, что и 'strcat'. Указывая на недостатки, мы просто пытаемся помочь OP избежать этих проблем и тем самым сделать мир лучше. –

ответ

2

Вы не должны написать свои собственные конкатенации, уже функционирует в стандартном libary, чтобы сделать эту задачу для вас!

#include <string.h> 

char *strcat(char *dest, const char *src); 
char *strncat(char *dest, const char *src, size_t n); 
+0

Мне любопытно, для чего был этот downvote - мог ли кто-нибудь помочь объяснить, что не так с моим решением? Я с полным правом описал одни и те же недостатки 'strcat' медведей, но, по крайней мере, это поднимает осознание! – LukeN

+2

Возможно, это было из-за того, что вы слепо ответили на вопрос, не дожидаясь, пока ОП разъяснит проблему, и ваш ответ на самом деле не отвечает на вопрос? –

+0

Ну, основное сообщение - «использовать strchr» и «не изобретать велосипед», этот момент попадает. Но я признаю, что я был чересчур драматичным. Я изменил свой ответ. – LukeN

1

Во втором фрагменте кода вы выделяете буфер размером 15 и затем назначаете его s1. Затем вы назначаете «rahul» на s1, который утечки только что выделенной памяти и присваивает s1 6-байтовой памяти, которую вы, вероятно, не можете записать. Измените s1 = "rahul"; на strcpy(s1, "rahul");, и вам, возможно, повезет больше.

Я согласен с другими ответами, хотя функция конкатенации опасна.

8
s1 = "rahul"; 

Эта строка не копирует строку «Rahul» в буфер, на который указывает s1; он перераспределяет указатель s1, чтобы указать на (не изменяемый) строка «Рахул»

Вы можете получить требуемую функциональность, используя вашу concatenate функцию дважды:

char *s1 = (char *) malloc(15); 

s1[0] = '\0'; // make sure the buffer is a null terminated string of length zero 
concatenate(s1, "rahul"); 
concatenate(s1, "bagai"); 

Обратите внимание, что функция concatenate еще несколько небезопасно, поскольку он слепо копирует байты, как и strcat. Вам нужно быть уверенным, что буфер, который вы передаете, достаточно велик или изменить его, чтобы взять длину буфера, например, strncat.

+0

Больше уклоняется от этого, поэтому он перепрыгивает через мой поспешный ответ :) – LukeN

+0

+1 для правильного использования функций. –

3

Когда вы делаете s1 = "rahul";, вы переписываете выделенную память. Эта строка не копирует «rahul» в область malloc'ed, она меняет s1, чтобы указать на константу строки «rahul» и выбрасывает указатель на память malloc'ed.

Вместо этого, вы должны использовать strcpy, чтобы скопировать строку в malloc'ed области:

// s1 = "rahul"; 
strcpy(s1, "rahul"); 

Это зафиксирует ваш звонок concatenate так s1 теперь будет указывать на правильную область 15 байт памяти.

В качестве альтернативы, вы можете отказаться от динамического распределения и выделения + назначить начальную строку сразу:

char s1[15] = "rahul"; 

Это выделит 15 байт в стеке и скопировать «Rahul» в это пространство. Обратите внимание на тонкость здесь. В этом случае на самом деле правильно использовать =, тогда как неверно, когда s1 объявлен как char *s1.

Один важный урок отладки, который вы можете узнать из этого, заключается в том, что когда ваша программа выходит из строя на определенной строке кода, это не значит, что это ошибка. Часто вы делаете ошибку в одной части своей программы, и эта ошибка не проявляется в аварии до более позднего времени. Это часть того, что отлаживает такой восхитительно расстраивающий процесс!

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