С конкатенацией строковых констант

один из ответов to почему вы не используете C для своих веб-приложений? содержит следующее:

для примера c дерьмо ниже:

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

на самом деле константы могут и должны быть объединены естественным образом в C:

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

и использование [] вместо * даже позволит вам изменить строку или найти их длину:

int foo_str_len = sizeof(foobar)-1;

Итак, пожалуйста, перед вами (ложно) утверждают, что C трудно использовать со строками, научиться использовать С.


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

ожидается ‘,’ или ‘;’ перед Строковой константой

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

3 ответов


(char*)malloc

никогда не печатайте результат malloc в C. Read этой и этой.

на самом деле константы могут и должны быть объединены естественным образом в C

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

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

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

Итак, пожалуйста, прежде чем вы (ложно) утверждаете, что C трудно использовать со строками, узнайте, как использовать C.

C и довольно сложно использовать со строками, как мы видим с этого примера. Несмотря на свою самонадеянность, человек, написавший его, перепутал различные понятия и еще должен научиться пользоваться C.


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


#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] = '';

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

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

foo
bar
foobar