Como é que eu junto um único charuto a um fio em C?
i.e
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
Para anexar um char a uma corda em C, é preciso primeiro assegurar-se de que o buffer de memória que contém a corda é suficientemente grande para acomodar um carácter extra. No seu programa de exemplo, você'teria de atribuir um novo bloco de memória adicional, porque a corda literal dada não pode ser modificada.
Aqui's uma amostra:
#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 );
}
Primeiro, utilizar malloc
para atribuir um novo pedaço de memória que seja suficientemente grande para acomodar todos os caracteres da cadeia de entrada, o char extra para anexar - e o zero final. Depois, chamar strcpy
para copiar a cadeia de caracteres de entrada para o novo buffer. Finalmente, alterar os dois últimos bytes no novo buffer para fazer tack no caracter a adicionar, bem como o zero final.
char* str = "blablabla";
Não deve modificar em nada esta corda. Reside na implementação definida apenas região lida. A sua modificação provoca **Comportamento indefinido***.
É preciso uma matriz de caracteres e não uma corda literal.
Boa leitura: Qual é a diferença entre char a[1] = "string" e char *p = "string";
Penso que não se pode declarar uma corda como essa em c. Só se pode fazer isso para const char e claro que não se pode modificar uma const char como é const.
Poderá utilizar uma matriz dinâmica de caracteres, mas terá de se ocupar da realocação.
EDIT: de facto, esta sintaxe compila correctamente. Ainda assim, não se pode modificar a que strass aponta se for inicializada na forma como o faz (a partir de string literal)