Strcat, 2 массива указателей

У меня есть такая функция, которая получает 2 массива в качестве аргументов char, мне нужно объединить эти строки. Извините за легкий вопрос.

    void Abc (char **a, char **b)
{

for (int i = 0; i < 200; i++)
{
a[i]="hello ";
}

for (int i = 0; i < 200; i++)
{
strcat(a[i], b[i]);       //doesn't show mistake, but it's there
cout << b[i]<<'\n';        //ok
cout << a[i]<<'\n';        //ok
cout<<strlen(b[i])<<'\n';  //ok
cout<<strlen(a[i])<<'\n';  //ok
}
}

Почему Strcat здесь не работает? Что я могу сделать, чтобы сделать эту работу?

1

Решение

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

for (int i = 0; i < 200; i++)
{
a[i]="hello ";

Компилятор не знает ваше намерение здесь, поэтому каждый элемент a[] назначен указатель на та же строка

a [0] == a [1] == a [2] == a [3] == a [4] == … a [199]

Даже если это сработало, проблема в том, что все элементы теперь указывают на массив char размера 7 {'h', 'e', 'l', 'l', 'o', 0}, Ты не можешь stract на конец их.

Вы должны убедиться, что каждый элемент a[] имеет указатель на уникальное пространство хранения и достаточно большой, чтобы получать ваши строки. Если твой a[] элементы уже указывают где-то действительный, что вам нужно сделать, это:

for (int i = 0; i < 200; i++)
{
strcpy(a[i], "hello ");
}
0

Другие решения

Во-первых, каждый a[i] указывает на строковый литерал и вызывает его изменение неопределенное поведение.

Во-вторых, когда ты strcat(x, y) Вы должны убедиться, что x достаточно места для хранения объединенных x а также y,

Следовательно, x Вы должны выделить память и перепроверить, вы должны использовать strncat чтобы избежать непреднамеренного переполнения.

0

Проблема в следующем утверждении.

a[i]="hello ";

Вместо копирования строкового литерала вы назначаете его адрес.

Используйте вместо

strcpy( a[i],"hello " );
0
По вопросам рекламы [email protected]