Как правильно использовать strcat для массива char? - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь объединить другую строку с аргументом [0].

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

int main() {

    char* arg[] = {
        "Hello",
        NULL,
        NULL,
        NULL
    };

    strcat(arg[0], " World");

}

Это возвращает прерывание прерывания.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Вы пытаетесь переписать строковый литерал с помощью:

char* arg[] = { "Hello", ..... };    // "Hello" is a string literal, pointed to by "arg[0]".

strcat(arg[0], " World");       // Attempt to rewrite/modify a string literal.

, что невозможно.

Строковые литералы доступны только для чтения, но не написать. Вот что делает их «буквальными».


Если вам интересно, почему:

char* arg[] = { "Hello", ..... }; 

подразумевает "Hello" как строковый литерал, вы должны прочитать ответы на него. вопрос:

В чем разница между char s [] и char * s?


Кстати, это было бы даже невозможно (или при по крайней мере, получите ошибку сегментации во время выполнения), если вы сделаете что-то подобное:

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

int main() {

    char a[] = "Hello";  // 6 for holding "Hello" (5) + "\0" (1). 

    strcat(a, " World");   

}

, потому что массив a должен иметь 12 символов для объединения обеих строк и использования strcat(a, " World"); - "Hello" (5 символов) + " World" (6 символов) + \0 (1 символ), но в нем всего 6 символов для удержания "Hello" + \0. При использовании strcat().

пространство памяти не добавляется в массив автоматически, если вы выполняете программу с этими операторами, вы пишете за пределами массива, который является неопределенным поведением и, вероятно, вы получите сообщение об ошибке ошибки сегментации.

0 голосов
/ 14 февраля 2020

Одним из недостатков C строк является то, что вам нужно знать, насколько они будут большими.

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

int main() {
    char arg[1024] = "Hello";
    strcat(arg, " World");
    printf("%s\n", arg);
}

В этом случае размер объединенной строки должен быть меньше 1024 персонажа. Вот почему безопаснее использовать что-то вроде C ++, где у вас есть std::string для предотвращения подобных проблем.

...