0

我意识到以下内容不起作用,但是否有等价物?

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

我想要做的是连接字符串,然后使连接的字符串成为静态变量,使其成为全局变量。我也喜欢不必为字符分配内存。我需要这个进去,main()因为我需要使用一个函数(sprintf)来合并两个字符串。

4

3 回答 3

1

sprintf被声明为 int sprintf(char *str, const char format, ...); char* str是将要写入输出的缓冲区,但是恶意用户可能会在该缓冲区中放入比该缓冲区的大小更多的内容,因此也可以使用snprintf其中包含一个包含输出缓冲区大小的参数,这样就不会发生缓冲区溢出。您应该注意它返回写入的字节数,因此您不能将其分配给 char或 char[]。

const char* foo = "foo";
static char end[BUFSIZE];
snprintf(end, BUFSIZE, ""%s_bar", foo);

我更喜欢使用snprintf它,因为它不会轻易导致缓冲区溢出,这是一个安全错误。如果 snprintf 返回 strlen("s_bar") + strlen("foo");现在它最多可以打印BUFSIZ字符给end你看连接是否成功

你还可以做的是:

char end[BUFSIZE] = "foo_";
strncat( end, "_bar", BUFSIZ);

这也许是你更喜欢的。

于 2013-08-01T14:39:08.810 回答
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;
}
于 2013-08-01T14:54:40.677 回答
1

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

#define FOO_INITIALIZER "foo"

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

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

于 2013-08-01T14:54:09.940 回答