2011-01-29 15 views
6

Utilizzando GDB, trovo ricevo un errore di segmentazione quando tento questa operazione:strcat concat un char su una stringa?

strcat(string,&currentChar); 

Dato che stringa viene inizializzato come

char * string = ""; 

e currentChar è

char currentChar = 'B'; 

Perché questo si traduce in un errore di segmentazione?

Se strcat non possono essere utilizzati per questo, altrimenti come posso concat un char su una stringa?

+3

strcat richiede stringhe null-terminated. Il tuo singolo carattere non ha valore nullo, quindi strcat continuerà a copiare fino a trovare un valore nullo da qualche parte lungo la linea, che potrebbe essere sul secondo byte per caso, o qualche gigabyte lungo la strada, per tutto il tempo copiando tutta la spazzatura nella tua stringa , stomping in pila –

risposta

4

Perché &currentChar non è una stringa, non finisce con il carattere \0. È necessario definire B come char *currentChar = 'B';. Sempre secondo http://www.cplusplus.com/reference/clibrary/cstring/strcatstring deve disporre di spazio sufficiente per contenere la stringa risultante (2 byte in questo caso), ma è solo 1 byte.

Oppure, se si desidera utilizzare char allora si può fare qualcosa di simile (a seconda del codice):

char string[256]; 
... 

char currentChar = 'B'; 
size_t cur_len = strlen(string); 
if(cur_len < 254) { 
    string[cur_len] = currentChar; 
    string[cur_len+1] = '\0'; 
} 
else 
    printf("Not enough space"); 
+0

Non il motivo per cui il programma è segfaulting. Questo è parte dell'errore se –

+0

@Foo '& currentChar' non punta su null termina stringa e ovviamente strcpy causerà un errore di sego – Elalfer

+0

Accetto questo come risposta perché copre che A: avevo bisogno dei terminatori nulli, e B: ho dovuto allocare più spazio per la stringa. – Blackbinary

1

strcat() prende due stringhe '\ 0'-terminati. Quando si passa l'indirizzo di un personaggio, la routine esaminerà la memoria che segue il personaggio, alla ricerca del terminatore.

Dal momento che non si sa cosa che la memoria si riferisce anche a, si dovrebbe aspettare problemi quando il codice vi accede.

In aggiunta a ciò, il tuo ragionamento stringa non avere spazio per avere tutti i caratteri allegati. Dove è scritta la memoria? Tenterà di scrivere oltre la fine della memoria associata a questa stringa.

+0

che non è perché il programma è segfaulting ... –

-1

Entrambi stringhe deve essere terminazione Null. Un singolo carattere non è terminato con null, quindi non è definito quando strcat smetterà di concatenare i caratteri fino alla fine. Inoltre, la stringa deve contenere almeno spazio sufficiente sia per la stringa originale che per la stringa risultante.

Questo funziona:

char string[10] = ""; 
char* currentChar = "B"; 
strcat(string, currentChar); 
+0

Questo non funziona perché non c'è abbastanza spazio nella stringa. Per vedere il mio punto, provalo: http://ideone.com/0jjST –

+0

Ci sono due problemi con il codice. Il primo argomento non ha abbastanza spazio, il secondo non ha terminatore. Perché ti concentri su un solo problema? –

+0

è parte del motivo, anche se hai ragione non è il principale. corretto per includere la causa principale del segfault – helloworld922

-1

Il primo argomento di strcat deve disporre di spazio sufficiente per contenere il resto della stringa. "" è una stringa costante e in quanto tale GCC non alloca lo spazio.

ne fanno un array con spazio sufficiente:

char buf[1024]; 

strcat(buf, ""); 
strcat(buf, "B"); 
7

Come risposto da altri, & currentChar è un puntatore a char o char *, ma una stringa in C è char [ ] o const char *.

Un modo per utilizzare strcat per concatenare un char a stringa è la creazione di una stringa minimo e utilizzarlo per trasformare un char in stringa.

Esempio:

Fare una stringa semplice, con solo 1 carattere e il suffisso '\ 0';

char cToStr[2]; 
cToStr[1] = '\0'; 

Applicando alla tua domanda:

char * string = ""; 
char currentChar = 'B'; 

cToStr assumerà la stringa "B":

cToStr[0] = currentChar; 

E strcat funzionerà!

strcat (string, cToStr); 
0

ritengo il metodo più semplice (non efficiente) sarebbe sprintf

sprintf(str, "%s%c", str, chr);