Aggiungi Char a String in C?

Come appendo un singolo carattere a una stringa in C?

vale a dire

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

 char* str = "blablabla"; 

Non dovresti modificare questa stringa. Risiede nella regione di sola lettura definita dall’implementazione. La modifica provoca un comportamento non definito .

Hai bisogno di un array di caratteri, non di una stringa letterale.

Buona lettura:
Qual è la differenza tra char a [] = “stringa”; e char * p = “stringa”;

Per aggiungere un carattere a una stringa in C, devi prima accertarti che il buffer di memoria contenente la stringa sia abbastanza grande da contenere un carattere extra. Nel tuo programma di esempio, dovresti allocare un nuovo blocco di memoria aggiuntivo perché la stringa letterale data non può essere modificata.

Ecco un esempio:

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

Innanzitutto, usa malloc per allocare un nuovo blocco di memoria che sia abbastanza grande da contenere tutti i caratteri della stringa di input, il carattere extra da aggiungere e lo zero finale. Quindi chiama strcpy per copiare la stringa di input nel nuovo buffer. Infine, cambia gli ultimi due byte nel nuovo buffer per virare sul personaggio da aggiungere e sullo zero finale.

Non penso che tu possa dichiarare una stringa del genere in c. Puoi farlo solo per const char * e ovviamente non puoi modificare un const char * come è const.

È ansible utilizzare il char array dinamico, ma è necessario occuparsi della riallocazione.

EDIT: in effetti questa syntax compila correttamente. Ancora non si può modificare ciò a cui si punta se è inizializzato nel modo in cui lo si fa (da stringa letterale)

Il modo più semplice per aggiungere due stringhe:

 char * append(char * string1, char * string2) { char * result = NULL; asprintf(&result, "%s%s", string1, string2); return result; } 

Il poster originale non intendeva scrivere:

  char* str = "blablabla"; 

ma

  char str[128] = "blablabla"; 

Ora, l’aggiunta di un singolo personaggio sembrerebbe più efficiente dell’aggiunta di un’intera stringa con strcat. Andando alla grande, potresti:

  char tmpstr[2]; tmpstr[0] = c; tmpstr[1] = 0; strcat (str, tmpstr); 

ma puoi anche scrivere facilmente la tua funzione (come molti hanno fatto prima di me):

  void strcat_c (char *str, char c) { for (;*str;str++); // note the terminating semicolon here. *str++ = c; *str++ = 0; } 

Crea una nuova stringa (stringa + carattere)

 #include  #include  #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] 

Non modificare le dimensioni dell’array ( [len +1] , ecc.) Senza conoscere la sua dimensione esatta, potrebbe danneggiare altri dati. alloc un array con la nuova dimensione e inserire invece i vecchi dati, ricorda che, per un array di caratteri, l’ultimo valore deve essere \0 ; calloc() imposta tutti i valori su \0 , che è eccellente per gli array di char .

Spero che questo possa essere d’aiuto.

C non ha stringhe di per sé – quello che hai è un puntatore char che punta ad una memoria di sola lettura contenente i caratteri “blablabla \ 0”. Per aggiungere un personaggio lì, hai bisogno di una memoria scrivibile eb) abbastanza spazio per la stringa nella sua nuova forma. La stringa letterale “blablabla \ 0” non ha né.

Le soluzioni sono:

1) Usa malloc() et al. allocare dynamicmente la memoria. (Non dimenticare di free() seguito.)
2) Usa un array di caratteri.

Quando lavori con le stringhe, strn* considerazione l’uso strn* varianti strn* delle funzioni str* : ti aiuteranno a rimanere entro limiti di memoria.

Nel mio caso, questa è stata la soluzione migliore che ho trovato:

 snprintf(str, sizeof str, "%s%c", str, c); 

ecco, FUNZIONA al 100%

 char* appending(char *cArr, const char c) { int len = strlen(cArr); cArr[len + 1] = cArr[len]; cArr[len] = c; return cArr; } 

in C ++, puoi semplicemente aggiungere un char a una string :

 int main() { std::string s = "Hello there"; char c = '?'; s = s+c; std::cout << s << std::endl; return 0; }