С конкатенацией строковых констант
один из ответов 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