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

向自定义字符串实现添加格式支持-C,c,string,C,String,我有一个C应用程序(不使用C99功能),它执行一些繁重的字符串处理。由于字符串长度未知,静态分配的缓冲区对我来说不是一个选项。我创建了一个简单的string实现,它将抽象缓冲区的空终止和动态扩展 这是它的样子 struct strbuf { char *buffer; /* null terminated buffer */ size_t length; /* length of the string excluding null ter

我有一个
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;
}
int strbuf\u add(struct strbuf*string,const char*c)
{
if(string==NULL)返回0;
而(*c!='\0'){
if(!add_char(string,*c++))
返回0;
}
返回1;
}
静态int add_char(struct strbuf*string,char c)
{
可用空间大小;
断言(字符串!=NULL);
可用空间=字符串->已分配-字符串->长度;
如果(空格_可用缓冲区[string->length++]=c;
字符串->缓冲区[字符串->长度]='\0';
返回1;
}
现在,我需要添加一个新的方法,比如,
addformatted
,它将采用类似于
sprintf
的格式。我想知道做这件事的最佳方法是什么?下面是我的想法

  • 使用
    vsnprintf
    。但我不确定这是否是可移植的,并且在所有平台上都有相同的行为
  • 我自己写一个格式解析器。但这似乎需要更多的工作
  • 在实现这一点上的任何帮助都将是巨大的。我只对便携式解决方案感兴趣

    • Dev Env:Linux与GCC
    • 预计将在MSVC上编译

    当您使用sprintf时,您必须对生成的字符串长度有一定的了解,否则您将使用snprintf并避免缓冲区溢出


    如果你想要这种接口,你可以创建一个函数来包装snprintf,并将缓冲区长度作为参数,在调用snprintf之前将字符串扩展到所需的长度。

    当你使用sprintf时,你必须对结果字符串的长度有一些概念,否则你就使用snprintf并保护自己不受缓冲区的影响流动


    如果你想要这种接口,你可以创建一个函数来包装snprintf,并将缓冲区长度作为参数,然后在调用snprintf之前将字符串扩展到所需的数量。

    snprintf
    是一种方法,并且有很好的定义行为,但是在一些中断的实现中,它会在调用时返回错误的值缓冲区太小。就我个人而言,我只会忽略已损坏的实现,除非您确实需要使用一个,或者提供整个
    printf
    系列的自定义实现来替换此类已损坏系统上的系统版本。否则,您需要研究这些系统表现出的已损坏行为,并找出如何编写变通方法unds。在调用成功之前,可能需要不断地扩大缓冲区。

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

    至少snprintf应该是可移植的。C语言中繁重的字符串处理?难道不能使用awk或perl吗?3.编写一个函数,将字符串插入到sprintf控制字符串中,然后将扩展的控制字符串和附加参数传递给*printf。提示:varargs。但是Nyan将其绑定:使用适合任务的语言它有实数字符串作为实数类型。至少snprintf应该是可移植的。C中的重字符串处理?你不能使用awk或perl吗?3.编写一个函数,将字符串插入到sprintf控制字符串中,然后将扩展的控制字符串和附加参数传递给*printf。提示:varargs。但是Nyan将其绑定为:使用lan适合于将实数字符串作为实数类型的任务的语言。