连接像printf一样的字符串

Bra*_*etz 2 c concatenation coercion

printf 是一个很棒的功能,因为它可以帮助您以非常干净的方式格式化字符串.

printf("Player %s has lost %d hitpoints", victim.name, damage);
Run Code Online (Sandbox Code Playgroud)

是否有类似的方法连接和执行强制在"正常字符串",如下所示:

uint8_t myString = ("Player %s has lost %d hitpoints", victim.name, damage); //SOMETHING LIKE THIS
Run Code Online (Sandbox Code Playgroud)

Har*_*ris 5

你可以用sprintf().像这样

char* myString = malloc(50);

sprintf(myString, "Player %s has lost %d hitpoints", victim.name, damage);
Run Code Online (Sandbox Code Playgroud)

正如您所猜测的那样,它代表字符串printf


请注意,sprintf()需要a char*,而不是uint8_t.


你也可以使用snprintf().附加的优点是您可以将要复制的字符数赋予字符串.这可以防止缓冲区溢出.

char* myString = malloc(50);

snprintf(myString, 50, "Player %s has lost %d hitpoints", victim.name, damage);
Run Code Online (Sandbox Code Playgroud)

  • 尽可能使用`snprintf`. (2认同)

M O*_*ehm 5

C99 snprintf打印到字符串并保证不会溢出缓冲区:

char msg[48];

snprintf(msg, sizeof(msg),
    "Player %s has lost %d hitpoints", victim.name, damage);
Run Code Online (Sandbox Code Playgroud)

snprintf返回字符串足够大时可能写入的字符数.因此,如果返回的值等于或大于缓冲区大小,则字符串将被截断.

传递缓冲区大小为零和空指针是合法的,这样您就可以通过首先进行探测调用来进行自己的分配:

char *msg;
int n;

n = snprintf(NULL, 0,
    "Player %s has lost %d hitpoints", victim.name, damage);

msg = malloc(n + 1);
n = snprintf(msg, n + 1,
    "Player %s has lost %d hitpoints", victim.name, damage);

// do stuff with msg

free(msg);
Run Code Online (Sandbox Code Playgroud)

在GNU编译器上,非sandard函数asprintf将为您执行此操作:

char *msg = asprintf("Player %s has lost %d hitpoints",
    victim.name, damage);

// do stuff with msg

free(msg);
Run Code Online (Sandbox Code Playgroud)