¿Anexar un carácter a una cadena en C?

¿Cómo puedo añadir un solo carácter a una cadena en C?

Por ejemplo

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

Para añadir un carácter a una cadena en C, primero hay que asegurarse de que el buffer de memoria que contiene la cadena es lo suficientemente grande como para acomodar un carácter extra. En su programa de ejemplo, tendría que asignar un nuevo bloque de memoria adicional porque la cadena literal dada no puede ser modificada.

Aquí'hay un ejemplo:

#include 

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 );
}

Primero, usa malloc para asignar un nuevo trozo de memoria lo suficientemente grande como para acomodar todos los caracteres de la cadena de entrada, el carácter extra a añadir - y el cero final. A continuación, llame a strcpy para copiar la cadena de entrada en el nuevo búfer. Por último, cambia los dos últimos bytes del nuevo búfer para añadir el carácter a añadir, así como el cero final.

Comentarios (3)
Solución
char* str = "blablabla";     

No debe modificar esta cadena en absoluto. Reside en la región de sólo lectura definida por la implementación. Su modificación provoca un comportamiento indefinido.

Se necesita una matriz de caracteres, no un literal de cadena.

Buena lectura: ¿Cuál es la diferencia entre char a[] = "cadena"; y char *p = "cadena"

Comentarios (0)

No creo que se pueda declarar una cadena así en c. Sólo se puede hacer eso para const char y por supuesto no se puede modificar un const char ya que es const.

Puedes usar un array dinámico de char pero tendrás que ocuparte de la reasignación.

EDIT: de hecho esta sintaxis compila correctamente. Aún así no deberías modificar lo que apunta str si se inicializa de la forma en que lo haces (desde el literal de cadena)

Comentarios (5)