Проблема с указателями в C Конкатенация строк - PullRequest
4 голосов
/ 28 мая 2011

Я выполняю некоторые упражнения и пытаюсь объединить две строки, используя только указатели (без массивов символов).Кажется, мой код компилируется (Примечание: я использую старый 16-битный компилятор Open Watcom):

#include <stdio.h>

int main(){
  char *str1 = "first";
  char *str2 =" second";

  strcat2(str1,str2);

  for(;*str1!='\0';str1++){
      printf(str1);
  }

  return 0;
}

int strcat2(char *s,char *t){
  for(;*s!='\0';s++){
    ;
  }

  while((*s++ = *t++)!='\0'){
    ;
  }

  *t++;
  t='\0';

  return 0;
}

Когда я пытался запустить его, ничего не происходило.Я уверен, что моя вышеупомянутая работа ужасно испорчена.Будем очень благодарны за любые советы и помощь.

Ответы [ 4 ]

4 голосов
/ 28 мая 2011

объявленные вами str1 и str2 являются строковыми литералами, которые нельзя изменить. В исполняемых файлах linux содержимое адреса, на которое указывают str1 и str2, хранится в разделе .rodata исполняемого файла, который недоступен для записи. В других исполняемых файлах содержимое хранится в аналогичном месте, которое недоступно для записи. Вы должны использовать массив или динамически выделенную область памяти, чтобы сделать эту работу. Убедитесь, что при конкатенации строки, к которой вы вставляете, у другой строки достаточно места для их хранения.

EDIT1:

Либо сделать

char str1[BUFF_SIZ] = "Hello", str2[BUFF_SIZ] = " Man";
/* Now do strcat */ 
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */

или

char *str1, *str2;
str1 = malloc (sizeof (char) * BUFF_SIZ);
str1 = malloc (sizeof (char) * BUFF_SIZ);
strcpy (str1, "Hello");
strcpy (str1, " Man");
/* Now do strcat */ 
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */
1 голос
/ 28 мая 2011

Ваш код не будет работать. Чтобы быть педантичным, он вызывает неопределенное поведение, потому что вы пытаетесь изменить содержимое строкового литерала.

char *str1 = "first";
char *str2 =" second";

str1 указывает на «первый», который находится в постоянной памяти.

Вместо того, чтобы иметь указатель на строковый литерал, вы должны иметь массив символов с достаточной емкостью для хранения объединенной строки "firstsecond"

Это работает согласно ожиданиям

#include <stdio.h>
int strcat2(char *s,char *t){    
   for(;*s!='\0';s++){
   }
   while((*s++ = *t++)!='\0'){        
   }
   t='\0';
   return 0;
}
int main(){
  char str1[15] = "first";
  char *str2 =" second";

  strcat2(str1,str2);
  printf("%s",str1);
  return 0;
}   

Онлайн демо здесь

0 голосов
/ 28 мая 2011

Вам нужен доступный для записи и достаточно большой буфер для записи, например,

char str1[32] = "first";
0 голосов
/ 28 мая 2011

цитата из man: strcat:

  char * strcat ( char * destination, const char * source );
  ...
  Parameters
  destination
  Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.

Ваша строка назначения не достаточно большая .

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