У меня есть такая функция, которая получает 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 здесь не работает? Что я могу сделать, чтобы сделать эту работу?
Вот источник вашей проблемы:
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 ");
}
Во-первых, каждый a[i]
указывает на строковый литерал и вызывает его изменение неопределенное поведение.
Во-вторых, когда ты strcat(x, y)
Вы должны убедиться, что x
достаточно места для хранения объединенных x
а также y
,
Следовательно, x
Вы должны выделить память и перепроверить, вы должны использовать strncat
чтобы избежать непреднамеренного переполнения.
Проблема в следующем утверждении.
a[i]="hello ";
Вместо копирования строкового литерала вы назначаете его адрес.
Используйте вместо
strcpy( a[i],"hello " );