C字符串连接的常量

时间:2012-04-24 09:57:01

标签: c string-concatenation

One of the answersWhy do you not use C for your web apps?包含以下内容:

  

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

实际上,常量CAN和应该在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中连接字符数组的其他方法。

3 个答案:

答案 0 :(得分:37)

  

(字符*)malloc的

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

  

实际上,常量CAN和应该在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.

答案 1 :(得分:7)

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

答案 2 :(得分:-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);
}

此代码连接str1str2而无需malloc,输出应为:

foo
bar
foobar