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

标签 c string

我有一个 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/

相关文章:

string - SAS如何根据字符串将观察结果拆分为多行?

c++ - 使用特殊参数拆分字符串

c++ - 从 char 字符串中提取 2 个数字?

c - 为什么 C99 标准的作者不指定浮点类型大小的标准?

c - 如何编写在C中传递给Variadic函数的变量

embedded - 如何通过在同一位置映射两个变量来重用物理内存?

c++ - 使用 std::equal_range 查找出现在字符串 vector 中的前缀范围

c - 从另一个 block 内增加变量

c++ - 手动检查套接字连接是否那么重要?

ruby - 如何找到字符串的最长重复序列