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

почему не работает следующая конкатенация строк?

main()
{
char *str1 = "United";
char *str2= "Front";
char *str3;
str3 = strcat(str1, str2 ) ;
printf("\n%s",str3 );

}

Я получил эту проблему в упражнениях в одной из книг по указателям. Вопрос упоминает

[Q] Правильно ли указан код, если нет, то также исправьте код.

Ответы [ 3 ]

1 голос
/ 18 июня 2019

См. Мой ответ на вопрос объединение символьных массивов в c

Вы не можете изменять строковые литералы.

Это утверждение

str3 = strcat(str1, str2 ) ;

пытается изменить строковый литерал str1 и, более того, пытается записать за пределы строкового литерала.

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

Вам нужно следующее

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

int main(void) 
{
    const char *str1 = "United";
    const char *str2 = "Front";

    char *str3 = malloc( strlen( str1 ) + strlen( str2 ) + 1 );

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

    free( str3 );

    return 0;
}

Вывод программы

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

Когда вы пишете char* s = "something" часть постоянной памяти выделяется. Подробнее об этом здесь .

Объявление strcat выглядит так:

char *strcat( char *dest, const char *src );

По сути, он добавляет src к dest, но, поскольку ваш пункт назначения, str1 не имеет достаточно памяти для хранения обеих строк.

Итак, я бы использовал snprintf с заранее выделенным буфером или:

char *str1 = "United";
char *str2 = "Front";

char *buf = calloc(strlen(str1) + strlen(str2) + 1, sizeof(char));

strncpy(buf, str1, strlen(str1));
strncat(buf, str2, strlen(str2));

printf("%s", buf);

Или с snprintf:

char *str1 = "United";
char *str2 = "Front";

int buf_len = strlen(str1) + strlen(str2) + 1;
char *buf = calloc(buf_len, sizeof(char));

snprintf(buf, buf_len, "%s%s", str1, str2);
0 голосов
/ 18 июня 2019

Первый параметр strcat (str1 в вашем случае) должен иметь достаточно выделенной памяти для хранения объединенной строки.Вы можете создать его с помощью malloc или объявить его как массив с достаточно большим размером.

...