2010-03-13 26 views
6

perché questo codice si arresta in modo anomalo? utilizza strcat illegale sui puntatori di caratteri?perché questo codice si arresta in modo anomalo?

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char *s1 = "Hello, "; 
    char *s2 = "world!"; 
    char *s3 = strcat(s1, s2); 
    printf("%s",s3); 
    return 0; 
} 

Si prega di dare un modo corretto con riferimento a entrambi gli array e puntatori.

+2

si utilizza strcat sbagliato. Aggiunge la seconda stringa alla fine della prima stringa. La stringa che restituisce è solo una comodità. Non è possibile modificare una stringa costante (il tuo s1), ecco perché si blocca. s1 punta alla memoria di sola lettura. –

+14

Se tutto andava bene, il codice non si arrestava. –

+1

Potresti voler modificare la tua domanda, Ashish. Probabilmente stai ottenendo un downvotes perché dici "anche se tutto va perfettamente bene". È una domanda molto valida, però. –

risposta

11

Il problema è che s1 punta a una stringa letterale e si sta tentando di modificarlo aggiungendo s2 ad esso. Non sei autorizzato a modificare i valori letterali stringa. È necessario creare un array di caratteri e copiare entrambe le stringhe in esso, in questo modo:

char *s1 = "Hello, "; 
char *s2 = "world!"; 

char s3[100] = ""; /* note that it must be large enough! */ 
strcat(s3, s1); 
strcat(s3, s2); 
printf("%s", s3); 

"Grande abbastanza" significa che almeno strlen(s1) + strlen(s2) + 1. Lo + 1 è responsabile del terminatore null.

Ciò detto, si dovrebbe seriamente considerare l'utilizzo di strncat (o forse meglio, ma non standard strlcat, se è disponibile), che sono i limiti-controllato, e, quindi, sono di gran lunga superiori a strcat.

+0

Array di lunghezza variabile (c99) o qualsiasi valore inferiore a 100! : P –

+0

La ragione per cui 'strcat' restituisce il suo primo argomento è una comodità per situazioni come questa - significa che puoi fare la concatenazione in una riga:' strcat (strcat (s3, s1), s2); ' – caf

+0

I In realtà preferisco snprintf a strncat in quasi tutti i casi come questo. Si tratta di un risultato minore nelle prestazioni, ma più probabile che venga utilizzato correttamente poiché l'uso corretto di strncat è incoerente con il resto della libreria. (La 'n' significa qualcosa di diverso da come la gente sembra pensare.) –

2

In questo caso, il modo corretto sarebbe allocare spazio sufficiente nella stringa di destinazione (s1) per memorizzare 6 caratteri extra (s2) e il terminatore null per la stringa.

char s1[14] = "Hello, "; 
char *s2 = "world!"; 
char *s3 = strcat(s1, s2); 
printf("%s",s3); 
0

Ecco una citazione dal manuale strcat(): "La funzione strcat() aggiunge la stringa src alla stringa dest, sovrascrivendo alla fine del dest del byte nullo ('\ 0'), e quindi aggiunge un byte null che termina. Le stringhe non possono sovrapporsi e la stringa di destinazione deve avere spazio sufficiente per il risultato. "

Il problema qui è che s1 e s2 puntano a stringhe statiche che sono "di sola lettura", quindi se si tenta di eseguire un'operazione strcat, con una stringa di questo tipo nei parametri dest, si otterrà un errore.

Il modo migliore per creare la stringa di hello world qui è di malloc it in modo che sia in grado di contenere sia s1 che s2. Inoltre, non dimenticare di aggiungere un '\ n' alla fine della stringa del formato printf altrimenti potresti rimanere sorpreso.

ecco il codice avrei scritto se fossi in te:


int main() 
{ 
    char* s1 = "Hello "; 
    char* s2 = "World !"; 
    char *s3 = malloc((strlen(s1) + strlen(s2) + 1) * sizeof(char)); 
/* +1 is for the null terminating character 
and sizeof(*s3) is the actual size of a char. */ 

    if (s3) 
    { 
    strcat(s3, s1); 
    strcat(s3, s2); 
    printf("%s\n", s3); 
    free(s3); // always free what you alloc when you don't need it anymore. 
    } 
    return 0; 
} 
Problemi correlati