C-конкатенация констант - программирование
Подтвердить что ты не робот

C-конкатенация констант

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

Для примера C crap ниже:

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.


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

ожидаемый ', или'; перед строковой константой

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

4b9b3361

Ответ 1

(char *) таНос

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

На самом деле константы МОЖЕШЬ И ДОЛЖНЫ быть объединены естественным образом в 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.

Ответ 2

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

Ответ 3

#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