2012-04-24 22 views
16

One of the answers-Why do you not use C for your web apps? contiene lo siguiente:C concatenación de cadenas de constantes

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.


he probado a mí mismo, sino conseguir un error:

expected ‘,’ or ‘;’ before string constant

Así que mi pregunta es: ¿Debo ¿Necesita decirle algo al compilador para que esto funcione o la publicación anterior es simplemente incorrecta? Tenga en cuenta que conozco otras formas de concatenar matrices de caracteres en C.

+15

Esa respuesta no tiene sentido. –

Respuesta

33

(char*)malloc

Nunca Typecast el resultado de malloc en C. Leer this y this.

Actually, constants CAN AND SHOULD be concatenated naturally in C

No, literales de cadena puede y debe ser concatenados en C. "foo" es una cadena literal y const char foo[] es una constante de cadena (array de caracteres). El código "foo" "bar" se concatenará automáticamente, el código foo bar no lo hará.

Si lo desea, puede ocultar los literales de cadena detrás de macros:

#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 es bastante difícil de usar con cuerdas, como podemos ver en este mismo ejemplo. A pesar de su confianza arrogante, la persona que lo escribió mezclado los diversos conceptos y todavía tiene que aprender a utilizar C.

+0

+1 Gracias por la respuesta detallada. –

+0

@Lundin hace esto funcionar con '" foo "bar()' donde 'bar()' devuelve 'char *' –

+1

@AlexejMagura Un char * no es una cadena literal, entonces no. – Lundin

7

Esa respuesta parece que alguien logró combinar literales de cadena, que pueden concatenarse de esa manera, con const variables de cadena. Mi suposición es que el original tenía macros de preprocesador en lugar de variables.

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

este código concatena str1 y str2 sin necesidad de malloc, la salida debe ser:

foo 
bar 
foobar 
+0

Sí, lo sé , Me olvidé de devolver el estado de salida – Raiz

+0

Por favor, no de nuevo. SO no es un sitio de tutorial. – Michi