Ответ 1
Проблемы с вашим подходом.
-
Строки C должны заканчиваться на 0 байт, другими словами символ
'\0'
. Использование""
добавляет это автоматически, но в противном случае вы должны добавить его самостоятельно, и все строковые функции зависят от того, что там 0. -
Ваш массив v содержит символы, а не строки, а
strcat
принимает строки.
Одно решение:
char cmd[50] = "some text here";
char *v[] = {"a","s","d","c","b"};
strcat(cmd,v[3]);
Это превращает ваш массив char в массив указателей на строки C.
Кроме того, это ваша обязанность позаботиться о том, чтобы cmd[]
содержало достаточно места для хранения того, что вы добавляете к нему с помощью strcat (вот оно). Обычно лучше использовать snprintf
для выполнения конкатенации строк, так как он принимает общий размер целевого массива, включая завершение нулевого значения, и добавляет, что этот нуль всегда, поэтому его сложнее испортить. Пример с исходным массивом char:
char cmd[50] = "some text here";
char buf[50];
char v[] = {'a','s','d','c','b'};
snprintf(buf, sizeof buf, "%s%c", cmd, v[3]);
Примечания: sizeof как это работает только тогда, когда buf
действительно представляет собой массив, объявленный с помощью []
, как здесь. Кроме того, с snprintf, использование того же буфера, что и аргумент назначения и формата, может привести к неожиданным результатам, поэтому я добавил новую переменную буфера назначения.
Еще один пример snprintf, только с вашими оригинальными двумя массивами, добавив к концу текущего содержимого cmd:
snprintf(cmd + strlen(cmd), (sizeof cmd) - strlen(cmd), "%c", v[3]);
Так ясно, что в этом конкретном случае strncat(cmd, &v[3], 1)
, предложенный в других ответах на добавление 1 символа, намного приятнее, но преимущество snprintf заключается в том, что вы можете добавить все типы данных, поддерживаемые printf, а не символы.