Добавить Char В строку в C?
Как добавить один char к строке в C?
i.e
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
Ответы
Ответ 1
char* str = "blablabla";
Вы не должны изменять эту строку вообще. Он находится в области определения только для чтения. Изменение этого параметра вызывает Undefined Поведение.
Вам нужен массив char, а не строковый литерал.
Хорошее чтение:
В чем разница между char a [] = "string" ; и char * p = "string" ;
Ответ 2
Чтобы добавить char в строку на C, сначала нужно убедиться, что буфер памяти, содержащий строку, достаточно велик, чтобы разместить дополнительный символ. В вашей примерной программе вам нужно будет выделить новый дополнительный блок памяти, потому что данную литеральную строку нельзя изменить.
Здесь пример:
#include <stdlib.h>
int main()
{
char *str = "blablabla";
char c = 'H';
size_t len = strlen(str);
char *str2 = malloc(len + 1 + 1 ); /* one for extra char, one for trailing zero */
strcpy(str2, str);
str2[len] = c;
str2[len + 1] = '\0';
printf( "%s\n", str2 ); /* prints "blablablaH" */
free( str2 );
}
Сначала используйте malloc
, чтобы выделить новый фрагмент памяти, который достаточно велик, чтобы разместить все символы входной строки, дополнительные char для добавления - и конечного нуля. Затем вызовите strcpy
, чтобы скопировать входную строку в новый буфер. Наконец, измените последние два байта в новом буфере, чтобы привязать к добавляемому символу, а также к завершающему нольу.
Ответ 3
Я не думаю, что вы можете объявить такую строку в c. Вы можете сделать это только для const char *, и, конечно, вы не можете изменить const char *, поскольку он является const.
Вы можете использовать динамический массив char, но вам придется позаботиться о перераспределении.
EDIT: на самом деле этот синтаксис правильно компилируется. Тем не менее вы не можете изменять то, на что указывает str, если оно инициализировано так, как вы это делаете (из строкового литерала)
Ответ 4
Самый простой способ добавить две строки:
char * append(char * string1, char * string2)
{
char * result = NULL;
asprintf(&result, "%s%s", string1, string2);
return result;
}
Ответ 5
Создайте новую строку (строка + char)
#include <stdio.h>
#include <stdlib.h>
#define ERR_MESSAGE__NO_MEM "Not enough memory!"
#define allocator(element, type) _allocator(element, sizeof(type))
/** Allocator function (safe alloc) */
void *_allocator(size_t element, size_t typeSize)
{
void *ptr = NULL;
/* check alloc */
if( (ptr = calloc(element, typeSize)) == NULL)
{printf(ERR_MESSAGE__NO_MEM); exit(1);}
/* return pointer */
return ptr;
}
/** Append function (safe mode) */
char *append(const char *input, const char c)
{
char *newString, *ptr;
/* alloc */
newString = allocator((strlen(input) + 2), char);
/* Copy old string in new (with pointer) */
ptr = newString;
for(; *input; input++) {*ptr = *input; ptr++;}
/* Copy char at end */
*ptr = c;
/* return new string (for dealloc use free().) */
return newString;
}
/** Program main */
int main (int argc, const char *argv[])
{
char *input = "Ciao Mondo"; // i am italian :), this is "Hello World"
char c = '!';
char *newString;
newString = append(input, c);
printf("%s\n",newString);
/* dealloc */
free(newString);
newString = NULL;
exit(0);
}
0 1 2 3 4 5 6 7 8 9 10 11
newString is [C] [i] [a] [o] [\32] [M] [o] [n] [d] [o] [!] [\0]
Не изменяйте размер массива ([len +1]
и т.д.), не зная его точного размера, он может повредить другие данные. alloc
массив с новым размером и вместо этого ставьте старые данные, помните, что для массива char последнее значение должно быть \0
; calloc()
устанавливает все значения в \0
, что отлично подходит для массивов char
.
Надеюсь, это поможет.
Ответ 6
Оригинальный плакат не означал написать:
char* str = "blablabla";
но
char str[128] = "blablabla";
Теперь добавление одного символа будет казаться более эффективным, чем добавление цельной строки с помощью strcat.
Идя по strcat, вы могли бы:
char tmpstr[2];
tmpstr[0] = c;
tmpstr[1] = 0;
strcat (str, tmpstr);
но вы также можете легко написать свою собственную функцию (как это делали некоторые до меня):
void strcat_c (char *str, char c)
{
for (;*str;str++); // note the terminating semicolon here.
*str++ = c;
*str++ = 0;
}
Ответ 7
C не имеет строк как таковых - у вас есть указатель char, указывающий на некоторую постоянную память, содержащую символы "blablabla\0". Чтобы добавить туда символ, вам понадобится: a) записываемая память и b) достаточно места для строки в ее новой форме. Строковый литерал "blablabla\0" не имеет ни одного.
Решения:
1) Используйте malloc()
et al. для динамического выделения памяти. (Не забудьте затем free()
.)
2) Используйте массив char.
При работе со строками рассмотрите варианты strn*
функций str*
- они помогут вам оставаться в пределах памяти.
Ответ 8
В моем случае это было лучшее решение, которое я нашел:
snprintf(str, sizeof str, "%s%c", str, c);
Ответ 9
здесь он, он РАБОТАЕТ 100%
char* appending(char *cArr, const char c)
{
int len = strlen(cArr);
cArr[len + 1] = cArr[len];
cArr[len] = c;
return cArr;
}
Ответ 10
в С++, вы можете просто добавить char
в string
с помощью:
int main()
{
std::string s = "Hello there";
char c = '?';
s = s+c;
std::cout << s << std::endl;
return 0;
}