gpt4 book ai didi

c - 向自定义字符串实现添加格式化支持 - C

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

我有一个 C 应用程序(不使用 C99 功能)执行一些繁重的字符串处理。由于字符串长度未知,静态分配的缓冲区对我来说不是一个选项。我创建了一个简单的 string 实现,它将抽象缓冲区的空终止和动态扩展。

这是它的样子,

struct strbuf {
char *buffer; /* null terminated buffer */
size_t length; /* length of the string excluding null terminator */
size_t allocated; /* total memory allocated */
};

add 函数将提供的字符串添加到缓冲区中。

int strbuf_add(struct strbuf *string, const char *c)
{
if(string == NULL) return 0;

while(*c != '\0') {
if(!add_char(string, *c++))
return 0;
}

return 1;
}

static int add_char(struct strbuf *string, char c)
{
size_t space_available;

assert(string != NULL);

space_available = string->allocated - string->length;
if(space_available <= 1) {
if(!grow_buffer(string)) {
return 0;
}
}
string->buffer[string->length++] = c;
string->buffer[string->length] = '\0';

return 1;
}

现在,我需要添加一个新方法,例如 addformatted,它将采用 sprintf 这样的格式。我想知道最好的方法是什么?以下是我的想法。

  1. 使用vsnprintf。但我不确定这是可移植的,并且在所有平台上都有相同的行为。
  2. 自己写一个格式解析器。但这似乎是更多的工作。

如果能帮助实现这一点,那就太好了。我只对可移植解决方案感兴趣。

  • 开发环境:带 GCC 的 Linux
  • 预计在 MSVC 上编译

最佳答案

snprintf 是要走的路并且具有明确定义的行为,但是有一些错误的实现,当缓冲区太小时它会返回错误的值。就个人而言,我会忽略损坏的实现,除非您确实需要使用一个,或者提供整个 printf 系列的自定义实现来替换此类损坏系统上的系统版本。否则,您需要研究这些系统表现出的损坏行为,并找出如何编写解决方法。它可能需要一遍又一遍地逐步扩大缓冲区,直到您的调用成功。

关于c - 向自定义字符串实现添加格式化支持 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3896469/

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