почему это кодирует катастрофический отказ? [дубликат]

6
задан Clifford 13 March 2010 в 07:59
поделиться

3 ответа

Проблема в том, что s1 указывает на строковый литерал, и вы пытаетесь изменить его, добавляя s2 к нему. Вам не разрешено изменять строковые литералы. Вам нужно создать массив символов и скопировать в него обе строки, например:

char *s1 = "Hello, ";
char *s2 = "world!";

char s3[100] = ""; /* note that it must be large enough! */
strcat(s3, s1);
strcat(s3, s2);
printf("%s", s3);

«Достаточно большой» означает как минимум strlen (s1) + strlen (s2) + 1 . + 1 предназначен для учета нулевого терминатора.

Сказав это, вам следует серьезно подумать об использовании strncat (или, возможно, лучшего, но нестандартного strlcat , если он доступен), которые проверяются по границам и, следовательно, намного превосходит strcat .

11
ответ дан 9 December 2019 в 20:41
поделиться

Вот цитата из руководства strcat (): «Функция strcat () добавляет строку src к строке dest, перезаписывая нулевой байт ('\ 0') в конце dest, а затем добавляет завершающий нуль. byte. Строки не могут перекрываться, и в строке dest должно быть достаточно места для результата. "

Проблема здесь в том, что s1 и s2 указывают на статические строки, которые доступны только для чтения, поэтому, если вы попытаетесь сделать strcat, с такой строкой в ​​параметрах dest вы получите ошибку.

Лучший способ создать здесь строку hello world - это выделить ее так, чтобы она могла содержать как s1, так и s2. Кроме того, не забудьте добавить '\ n' в конец строки формата printf, иначе вы можете быть удивлены.

Вот код, который я бы написал на вашем месте:


int main()
{
  char* s1 = "Hello ";
  char* s2 = "World !";
  char *s3 = malloc((strlen(s1) + strlen(s2) + 1) * sizeof(char));
/* +1 is for the null terminating character
and sizeof(*s3) is the actual size of a char. */

  if (s3)
  {
    strcat(s3, s1);
    strcat(s3, s2);
    printf("%s\n", s3);
    free(s3); // always free what you alloc when you don't need it anymore.
  }
  return 0;
}
0
ответ дан 9 December 2019 в 20:41
поделиться

Правильный способ в этом случае - выделить достаточно места в строке назначения (s1) для хранения 6 дополнительных символов (s2), а также нулевого терминатор для строки.

char s1[14] = "Hello, ";
char *s2 = "world!";
char *s3 = strcat(s1, s2);
printf("%s",s3);
1
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: