21

为什么不将 C 用于 Web 应用程序答案之一?包含以下内容:

对于下面的 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。


我自己尝试过,但出现错误:

预期 ',' 或 ';' 字符串常量之前

所以我的问题是:我是否需要告诉编译器一些事情才能完成这项工作,还是上面的帖子完全错误?请注意,我知道在 C 中连接字符数组的其他方法。

4

3 回答 3

40

(char*)malloc

永远不要在 C 中对 malloc 的结果进行类型转换。阅读thisthis

实际上,常量可以并且应该在 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。

于 2012-04-24T12:47:03.490 回答
7

该答案看起来像是有人设法将可以以这种方式连接的字符串文字与const字符串变量混为一谈。我的猜测是原来有预处理器宏而不是变量。

于 2012-04-24T10:02:14.230 回答
-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
于 2016-07-27T09:55:33.497 回答