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)
你可以用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)
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)
| 归档时间: |
|
| 查看次数: |
5113 次 |
| 最近记录: |