2012-04-24 11 views
16

One of the answers do Why do you not use C for your web apps? zawiera następujące elementy:C konkatenacji ciąg stałych

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.


Próbowałem to sam, ale pojawia się błąd:

expected ‘,’ or ‘;’ before string constant

Więc moje pytanie brzmi: czy ja trzeba powiedzieć kompilatorowi coś, aby to działało lub czy powyższy post jest po prostu błędny? Należy pamiętać, że jestem świadomy innych sposobów łączenia tablic znaków w C.

+15

Ta odpowiedź to nonsens. –

Odpowiedz

33

(char*)malloc

Nigdy typecast wynik malloc w C Przeczytaj this i this.

Actually, constants CAN AND SHOULD be concatenated naturally in C

Nie łańcuch literałami mogą i powinny być sklejane w C. "foo" jest Łańcuch znaków i const char foo[] jest stały łańcuch (tablica znaków). Kod "foo" "bar" zostanie automatycznie połączony, kod foo bar nie będzie.

Jeśli chcesz, możesz ukryć literały ciągów za makr:

#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 jest raczej trudne do wykorzystania z tekstem, jak widzimy z tego samego przykładu. Pomimo ich aroganckiej pewności siebie, osoba, która go napisała mieszają się różne koncepcje i nadal musi nauczyć się korzystać C.

+0

+1 Dziękujemy za szczegółową odpowiedź. –

+0

@Lundin działa z '' foo 'bar() 'gdzie' bar() 'zwraca' char * '? –

+1

@AlexejMagura Char * nie jest literałem ciąg, więc nie. – Lundin

7

Ta odpowiedź wygląda na to, że komuś udało się połączyć literały łańcuchowe, które można łączyć w ten sposób ze zmiennymi łańcuchowymi const. Domyślam się, że oryginał miał makra preprocesora zamiast zmiennych.

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

ten kod łączy str1 i str2 bez potrzeby malloc, wyjście powinno być:

foo 
bar 
foobar 
+0

Tak, wiem , Zapomniałem wrócić status wyjścia – Raiz

+0

Proszę nie ponownie. SO nie jest stroną samouczka. – Michi