gpt4 book ai didi

c - 如果 snprintf 在格式说明符中间停止,如何继续?

转载 作者:太空宇宙 更新时间:2023-11-04 05:55:07 24 4
gpt4 key购买 nike

snprintf 函数在输出缓冲区可能不够大以容纳格式化字符串时是完美的。但是,如果 snprintf 的调用由于缓冲区长度不足而停止,如何继续打印到另一个缓冲区?

char buf1[16] = {0};
char buf2[16] = {0};
int n = snprintf(buf1, sizeof buf1, "Lorem ipsum %d dolor sit", 123456);
assert(strcmp(buf1, "Lorem ipsum 123") == 0); // ok

// Insert solution here

assert(strcmp(buf2, "456 dolor sit") == 0); // expected result

附言我对 snprintf 并不着迷,任何局限于标准 C 库的解决方案都可以。

最佳答案

没有。 snprintf 是无状态的,它不能简单地从停止的地方“恢复”。最接近的方法是分配一个更大的缓冲区,将整个消息打印到该缓冲区,然后将所需的子字符串 strcpy 到目标缓冲区。

char buf1[16] = {0};
char buf2[16] = {0};
int n = snprintf(buf1, sizeof(buf1), "Lorem ipsum %d dolor sit", 123456);

if (n > 15) {
char* t = malloc(n+1);
if (t) {
n = snprintf(t, n, "Lorem ipsum %d dolor sit", 123456);
strncpy(buf2, t+sizeof(buf1)-1, sizeof(buf2)-1);
free(t);
}
//might fail the subsequent assert if malloc failed
}

assert(strcmp(buf1, "Lorem ipsum 123") == 0); // ok
assert(strcmp(buf2, "456 dolor sit") == 0); // expected result

关于c - 如果 snprintf 在格式说明符中间停止,如何继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29438326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com