Подтвердить что ты не робот

Добавить Char В строку в C?

Как добавить один char к строке в C?

i.e

char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
4b9b3361

Ответ 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;
}