2013-08-27 11 views
8

ho scritto il seguente programma C:concatenare due stringhe char * in un programma C

int main(int argc, char** argv) { 

    char* str1; 
    char* str2; 
    str1 = "sssss"; 
    str2 = "kkkk"; 
    printf("%s", strcat(str1, str2)); 

    return (EXIT_SUCCESS); 
} 

voglio per concatenare le due stringhe, ma non funziona.

+4

non si riescono a allocare un buffer di destinazione di dimensioni sufficienti, e il tentativo di scrivere nella memoria non modificabile. –

+4

Quando dici "non funziona?", Cosa intendi? Che cosa stampa invece di quello che dovrebbe? Anche se è abbastanza ovvio, dovresti anche dire cosa pensi che debba stampare, per chiarire. – qaphla

+0

vedi questa domanda [Usando strcat in C] (http://stackoverflow.com/questions/419604/using-strcat-in-c) – lsalamon

risposta

15

Il modo in cui funziona è quello di: memoria

  1. Malloc abbastanza grande per contenere copie di str1 e str2
  2. Poi esso copia str1 in str3
  3. Poi aggiunge str2 sull'estremità del str3
  4. Quando si utilizza str3 che normalmente liberarla free (str3);

Ecco un esempio con cui si gioca. È molto semplice e non ha lunghezze hard-coded. Si può provare qui: http://ideone.com/d3g1xs

Vedi this post Per informazioni sulla dimensione del carattere

#include <stdio.h> 
#include <memory.h> 

int main(int argc, char** argv) { 

     char* str1; 
     char* str2; 
     str1 = "sssss"; 
     str2 = "kkkk"; 
     char * str3 = (char *) malloc(1 + strlen(str1)+ strlen(str2)); 
     strcpy(str3, str1); 
     strcat(str3, str2); 
     printf("%s", str3); 

     return 0; 
} 
+0

qual è la differenza di 'str3 =" sssss "' e 'strcpy (str3, str1)'? – BeCurious

+0

str3 deve puntare alla memoria che è abbastanza grande da contenere la stringa. Questo è il motivo per cui l'ho inserito nella riga sopra. – dcaswell

+0

Ma dopo questo codice 'char * str3 = (char *) malloc (1 + sizeof (char *) * (strlen (str1) + strlen (str2)))' Perché non usare 'str3 =" sssss "' ma usa 'strcpy (str3, str1)' invece? :) – BeCurious

3

strcat concats str2 sul str1

Si otterrà errori di runtime perché str1 non viene adeguatamente stanziati per la concatenazione

+1

Infatti 'strcat' restituisce la stringa concatenata. –

1

strcat(str1, str2) accoda str2 dopo str1. Richiede che str1 abbia abbastanza spazio per contenere str2. Nel tuo codice, str1 e str2 sono tutte costanti di stringa, quindi non dovrebbe funzionare. Si può provare in questo modo:

char str1[1024]; 
char *str2 = "kkkk"; 
strcpy(str1, "ssssss"); 
strcat(str1, str2); 
printf("%s", str1); 
1

strcat tentativi di aggiungere il secondo parametro al primo. Questo non funzionerà dato che stai assegnando stringhe costanti di dimensioni implicite.

Se tutto quello che vogliamo fare è stampare due stringhe fuori

printf("%s%s",str1,str2); 

farebbe.

Si potrebbe fare qualcosa di simile

char *str1 = calloc(sizeof("SSSS")+sizeof("KKKK")+1,sizeof *str1); 
strcpy(str1,"SSSS"); 
strcat(str1,str2); 

per creare una stringa concatenata; tuttavia, considera fortemente l'uso di strncat/strncpy. E leggi attentamente le pagine man per quanto sopra. (oh e non dimenticare di free str1 alla fine).

+0

Qual è la differenza di 'str1 =" ssss "' e 'strcpy (str1," ssss ")'? – BeCurious

2

Quando si utilizzano stringhe letterali, ad esempio "this is a string" e nel proprio caso "sssss" e "kkkk", il compilatore le mette nella memoria di sola lettura. Tuttavia, strcat tenta di scrivere il secondo argomento dopo il primo. È possibile risolvere questo problema creando un buffer di destinazione di dimensioni sufficienti e scrivendo su questo.

char destination[10]; // 5 times s, 4 times k, one zero-terminator 
char* str1; 
char* str2; 
str1 = "sssss"; 
str2 = "kkkk"; 
strcpy(destination, str1); 
printf("%s",strcat(destination,str2)); 

nota che negli ultimi compilatori, di solito si ottiene un messaggio di avviso per la fusione stringhe ai puntatori di caratteri non-const.

+0

grazie per la tua risposta perfetta +1024! – BeCurious

11

Here è una soluzione di lavoro:

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

int main(int argc, char** argv) 
{ 
     char str1[16]; 
     char str2[16]; 
     strcpy(str1, "sssss"); 
     strcpy(str2, "kkkk"); 
     strcat(str1, str2); 
     printf("%s", str1); 
     return 0; 
} 

uscita:

ssssskkkk 

Bisogna allocare memoria per le stringhe. Nel codice sopra, dichiaro str1 e str2 come matrici di caratteri contenenti 16 caratteri. Ho usato strcpy per copiare caratteri di stringhe letterali e strcat per aggiungere i caratteri di str2 alla fine di str1.Ecco come questi array di caratteri sembrano durante l'esecuzione del programma:

After declaration (both are empty): 
str1: [][][][][][][][][][][][][][][][][][][][] 
str2: [][][][][][][][][][][][][][][][][][][][] 

After calling strcpy (\0 is the string terminator zero byte): 
str1: [s][s][s][s][s][\0][][][][][][][][][][][][][][] 
str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] 

After calling strcat: 
str1: [s][s][s][s][s][k][k][k][k][\0][][][][][][][][][][] 
str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] 
+0

Funziona, grazie per la tua risposta dettagliata! – BeCurious

+0

A + per sforzo e una spinta verso l'alto! – amrith