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.
Ответы
Ответ 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