全局变量主要用于连接?

时间:2013-08-01 14:34:37

标签: c

我意识到以下方法不起作用但是有相同之处吗?

const char *foo = "foo";
static char *end = sprintf ("%s_bar", foo);

我想要做的是连接字符串,然后使该连接字符串成为静态变量,以便它成为全局变量。此外,我不喜欢将内存分配给char。我需要这个进入main(),因为我需要使用一个函数(sprintf)来合并两个字符串。

3 个答案:

答案 0 :(得分:1)

sprintf被声明为int sprintf(char * str,const char format,...); char* str是输出将被写入的缓冲区,但恶意用户可能会向缓冲区添加的内容多于缓冲区的大小,因此也可以使用snprintf,其中包含一个包含大小的参数的const char* foo = "foo"; static char end[BUFSIZE]; snprintf(end, BUFSIZE, ""%s_bar", foo); 输出缓冲区,因此不会发生缓冲区溢出。你应该注意它返回写入的字节数,因此你不能将它分配给char 或char []。

snprintf

我更喜欢使用BUFSIZ因为它不容易导致缓冲区溢出,这是一个安全错误。现在,如果snprintf返回strlen(“s_bar”)+ strlen(“foo”);

,它可以查看end字符到char end[BUFSIZE] = "foo_"; strncat( end, "_bar", BUFSIZ); ,你可以查看连接是否成功

您还可以做的是:

{{1}}

这可能更像你喜欢的。

答案 1 :(得分:1)

从表面上看,您可以按如下方式修改代码:

#define FOO_INITIALIZER "foo"

const char *foo = FOO_INITIALIZER;
static char *end = FOO_INITIALIZER "_bar";

我不确定它买了多少,但它应该编译并避免重复字符串。它使用相邻的字符串文字串联,这在C89及更高版本中是标准的(但不在预标准编译器中)。

答案 2 :(得分:1)

我认为你可以使用字符串化操作符来完成它。

#define STR_CONCAT(x, y)      #x#y

static char *end = STR_CONCAT(foo, _bar);

int main(void)
{
    printf("%s", end); // prints out "foo_bar"
    getchar();
    return 0;
}