Конкатенация массива символов C

что у меня есть:

char cmd[50] = "some text here";
char v[] = {'a','s','d','c','b'};

поэтому я хочу объединить cmd добавив письмо от v.

очевидно:

strcat(cmd, v[3]);

не работает, потому что strcat не принимает v[n] параметр n = int.

7 ответов


проблемы с вашим подходом.

  • строки C должны заканчиваться на 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 для конкатенации строк, так как требуется общий размер целевого массива в том числе завершение null и добавляет, что null всегда есть, поэтому сложнее испортить. Пример с вашим оригинальным 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, а не символы.


Мда. Насколько я понимаю, вы хотите добавить один символ из второго массива? поэтому вы должны использовать

  strncat (cmd, &v[3], 1);

: -)


Do не используйте этот:

strcat(cmd,&v[3]);

&v[3] не является указателем на строку с нулевым завершением! вместо этого используйте

strncat(cmd, &v[3], 1);

во-первых, убедитесь, что переменная " cmd " имеет достаточно выделенной памяти.

во-вторых, упоминание 'v[3]' является значением, которое является подписанным байтом. Вы должны использовать следующий вызов strncat (не strcat):

strncat(cmd,&v[3],1);

как о

strcat(cmd,&v[3]);

проблема в том, что вы также не используете strcat:

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

потому что ты

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

поэтому вы должны объявить char * как ваш char.


char buf[2];

sprintf(buf,"%c", V[3]);
strcat(cmd, buf);

или

strncat (cmd, &v[3],1);

вы не можете сделать это с помощью

strcat(cmd,&v[3]);

это будет копировать массив V из ячейки 3 в конец массива, а не копировать только V[3]

Я могу предложить другое решение

int len = strlen(cmd);
cmd[len]=v[3];
cmd[len+1] = '';