конкатенация массивов символов в c - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь объединить 2-х символьные массивы, но при попытке это не работает, и моя консоль o / p зависает и ничего не печатает.

   char *str[2];
   str[0] = "Hello ";
   str[1] = "World";
   strcat(str[0],str[1]);
   printf("%s\n",str[0]);

Я даже попробовал приведенный ниже код, который также не работает

   char *str1 = "Hello ";
   char *str2 = "World";
   strcat(str1,str2);
   printf("%s\n",str1);

Может кто-нибудь объяснить это?

ТИА.

Ответы [ 3 ]

0 голосов
/ 18 июня 2019
char *str1 = "Hello ";
char *str2 = "World";
strcat(str1,str2);
printf("%s\n",str1);

Здесь у вас есть str1, указывающий на статическую зону памяти, которая может находиться на странице только для чтения, и strcat пытается написать в этой области в конце строки «Hello».

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

Способ сделать это - это

char str1[100] = "Hello ";
char *str2 = "World";
strcat(str1,str2);
printf("%s\n",str1);

Вместо 100 вы можете выбрать размер, такой как конкатенация (включаяпоследний символ NULL), который должен иметь место.

0 голосов
/ 18 июня 2019

Этот код иллюстрирует проблему:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *str1 = "Hello ";
    char *str2 = "World";
    char *ptr1, *ptr2;

    printf("Find the end of str1...\n");
    ptr1 = str1;
    while (ptr1[0] != '\0') {
        ptr1++;
    }
    printf("Copy str2 to the end of str1...\n");
    ptr2 = str2;
    while (ptr2[0] != '\0') {
        printf("Attempt to write to read-only memory...\n");
        ptr1[0] = ptr2[0];
        printf("We never get here.\n");
        ptr1++;
        ptr2++;
    }
    ptr2[0] = '\0';
    printf("Done.\n");
    return 0;
}

Выход

Find the end of str1...
Copy str2 to the end of str1...
Attempt to write to read-only memory...
Bus error: 10
0 голосов
/ 18 июня 2019

Чтобы объединить две строки, нужно либо создать новую, достаточно большую, чтобы tp содержал обе исходные строки, либо одна из строк должна быть достаточно большой, чтобы содержать вторую добавленную строку.

Учтите, что строковые литералы неизменны в C (и C ++). Любая попытка изменить строковый литерал приводит к неопределенному поведению.

Вы можете объединять строки, если одна из них хранится в массиве символов.

Например

char str1[12] = "Hello ";
const char *str2 = "World";

strcat( str1, str2 );
puts( str1 );

Или вы можете создать третью строку.

const char *str[2];
str[0] = "Hello ";
str[1] = "World";

char *str1 = malloc( strlen( str[0] ) + strlen( str[1] ) + 1 );

strcpy( str1, str[0] );
strcat( str1, str[1] );

puts( str1 );

free( str1 );
...