2012-04-24 22 views
16

One of the answers-Why do you not use C for your web apps? contiene quanto segue:C concatenazione di stringhe di costanti

For the C crap example below:

const char* foo = "foo"; 
const char* bar = "bar"; 
char* foobar = (char*)malloc(strlen(foo)+strlen(bar)+1); 
strcpy(foobar, foo); 
strcat(foobar, foo); 

Actually, constants CAN AND SHOULD be concatenated naturally in C:

const char foo[] = "foo"; 
const char bar[] = "bar"; 
char foobar[] = foo bar; // look Ma, I did it without any operator! 

And using [] instead of * will even let you modify the string, or find their length:

int foo_str_len = sizeof(foobar)-1; 

So, PLEASE, before you (falsely) claim that C is difficult to use with strings, learn how to use C.


ho provato io stesso, ma un errore:

expected ‘,’ or ‘;’ before string constant

Quindi la mia domanda è: Devo devo dire al compilatore qualcosa per far funzionare questo o semplicemente il post sopra è sbagliato? Si noti che sono a conoscenza di altri modi per concatenare gli array di caratteri in C.

+15

Questa risposta è una sciocchezza. –

risposta

33

(char*)malloc

Mai typecast il risultato di malloc in C. this Leggere e this.

Actually, constants CAN AND SHOULD be concatenated naturally in C

No, stringhe può e deve essere concatenati in C. "foo" è una stringa letterale e const char foo[] è una costante stringa (array di caratteri). Il codice "foo" "bar" verrà concatenato automaticamente, il codice foo bar no.

Se si desidera, è possibile nascondere le stringhe letterali dietro le macro:

#define foo "foo" 
#define bar "bar" 
char foobar[] = foo bar; // actually works 

So, PLEASE, before you (falsely) claim that C is difficult to use with strings, learn how to use C.

C è piuttosto difficile da usare con le stringhe, come possiamo vedere da questa esempio. Nonostante la loro arrogante sicurezza, la persona che lo ha scritto mescolato i vari concetti e deve ancora imparare ad utilizzare C.

+0

+1 Grazie per la risposta dettagliata. –

+0

@Lundin funziona con '" foo "bar()' dove 'bar()' restituisce un 'char *'? –

+1

@AlexejMagura Un char * non è una stringa letterale, quindi no. – Lundin

7

Questa risposta sembra che qualcuno sia riuscito a raggruppare stringhe letterali, che possono essere concatenate in questo modo, con le variabili stringa const. La mia ipotesi è che l'originale avesse macro preprocessore invece di variabili.

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

int 
main(int argc, char *argv[]) 
{ 
    char *str1 = "foo"; 
    char *str2 = "bar"; 
    char ccat[strlen(str1)+strlen(str2)+1]; 

    strncpy(&ccat[0], str1, strlen(str1)); 
    strncpy(&ccat[strlen(str1)], str2, strlen(str2)); 
    ccat[strlen(str1)+strlen(str2)+1] = '\0'; 

    puts(str1); 
    puts(str2); 
    puts(ccat); 
} 

questo codice concatena str1 e str2 senza la necessità di malloc, l'uscita dovrebbe essere:

foo 
bar 
foobar 
+0

Sì, lo so , Ho dimenticato di restituire lo stato di uscita – Raiz

+0

Per favore non ancora. SO non è un sito di tutorial. – Michi