我意识到以下方法不起作用但是有相同之处吗?
const char *foo = "foo";
static char *end = sprintf ("%s_bar", foo);
我想要做的是连接字符串,然后使该连接字符串成为静态变量,以便它成为全局变量。此外,我不喜欢将内存分配给char。我需要这个进入main()
,因为我需要使用一个函数(sprintf)来合并两个字符串。
答案 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;
}