Как добавить один char к строке в C?
i.e
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
Как добавить один char к строке в C?
i.e
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
char* str = "blablabla";
Вы не должны изменять эту строку вообще. Он находится в области определения только для чтения. Изменение этого параметра вызывает Undefined Поведение.
Вам нужен массив char, а не строковый литерал.
Хорошее чтение:
В чем разница между char a [] = "string" ; и char * p = "string" ;
Чтобы добавить 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
, чтобы скопировать входную строку в новый буфер. Наконец, измените последние два байта в новом буфере, чтобы привязать к добавляемому символу, а также к завершающему нольу.
Я не думаю, что вы можете объявить такую строку в c. Вы можете сделать это только для const char *, и, конечно, вы не можете изменить const char *, поскольку он является const.
Вы можете использовать динамический массив char, но вам придется позаботиться о перераспределении.
EDIT: на самом деле этот синтаксис правильно компилируется. Тем не менее вы не можете изменять то, на что указывает str, если оно инициализировано так, как вы это делаете (из строкового литерала)
Самый простой способ добавить две строки:
char * append(char * string1, char * string2)
{
char * result = NULL;
asprintf(&result, "%s%s", string1, string2);
return result;
}
Создайте новую строку (строка + 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
.
Надеюсь, это поможет.
Оригинальный плакат не означал написать:
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;
}
C не имеет строк как таковых - у вас есть указатель char, указывающий на некоторую постоянную память, содержащую символы "blablabla\0". Чтобы добавить туда символ, вам понадобится: a) записываемая память и b) достаточно места для строки в ее новой форме. Строковый литерал "blablabla\0" не имеет ни одного.
Решения:
1) Используйте malloc()
et al. для динамического выделения памяти. (Не забудьте затем free()
.)
2) Используйте массив char.
При работе со строками рассмотрите варианты strn*
функций str*
- они помогут вам оставаться в пределах памяти.
В моем случае это было лучшее решение, которое я нашел:
snprintf(str, sizeof str, "%s%c", str, c);
здесь он, он РАБОТАЕТ 100%
char* appending(char *cArr, const char c)
{
int len = strlen(cArr);
cArr[len + 1] = cArr[len];
cArr[len] = c;
return cArr;
}
в С++, вы можете просто добавить char
в string
с помощью:
int main()
{
std::string s = "Hello there";
char c = '?';
s = s+c;
std::cout << s << std::endl;
return 0;
}