программа конкатенации в C - PullRequest
1 голос
/ 25 июля 2010

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

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);

Ответы [ 4 ]

8 голосов
/ 25 июля 2010
s1 = "rahul";

Эта строка не копирует строку "rahul" в буфер, на который указывает s1;он переназначает указатель s1, указывающий на (не изменяемый) строковый литерал "rahul"

Вы можете получить желаемую функциональность, дважды воспользовавшись функцией 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.

3 голосов
/ 25 июля 2010

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

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

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

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

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

char s1[15] = "rahul";

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

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

2 голосов
/ 25 июля 2010

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

#include <string.h>

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
1 голос
/ 25 июля 2010

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

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

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