2012-04-24 2 views
16

One of the answers к Why do you not use C for your web apps? содержит следующее:C конкатенация констант

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.


Я пробовал сам, но получаю сообщение об ошибке:

expected ‘,’ or ‘;’ before string constant

Так что мой вопрос: Должен ли я нужно сказать компилятору что-то, чтобы сделать эту работу, или это сообщение выше, просто неправильно? Обратите внимание, что я знаю о других способах конкатенации массивов символов в C.

+15

Этот ответ вздор. –

ответ

33

(char*)malloc

Никогда не типаж результат таНос в C. Read this и this.

Actually, constants CAN AND SHOULD be concatenated naturally in C

Нет, строковые литералы могут и должны быть объединены в С. "foo" является строковым и const char foo[] постоянная строка (массив символов). Код "foo" "bar" будет конкатенировать автоматически, код foo bar не будет.

Если вы хотите, вы можете скрыть строки литералов за макросы:

#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 является довольно трудно использовать со строками, как мы можем видеть из этого самого примера. Несмотря на их высокомерной уверенности, человек, который написал его смешались различные концепции и до сих пор, чтобы узнать, как использовать C.

+0

+1 Спасибо за подробный ответ. –

+0

@ Lundin делает это с '' foo "bar()' где 'bar()' возвращает 'char *'? –

+1

@AlexejMagura Символ * не является строковым литералом, поэтому нет. – Lundin

7

Этот ответ выглядит так, как будто кому-то удалось сконфигурировать строковые литералы, которые могут быть объединены таким образом, с помощью строковых переменных const. Я предполагаю, что у оригинала были макросы препроцессора вместо переменных.

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

этот код присоединяет str1 и str2 без необходимости malloc, вывод должен быть:

foo 
bar 
foobar 
+0

Да, я знаю , Я забыл вернуть статус выхода – Raiz

+0

Пожалуйста, не снова. SO не является учебным сайтом. – Michi

Смежные вопросы