向自定义字符串实现添加格式支持-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上编译
如果你想要这种接口,你可以创建一个函数来包装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适合于将实数字符串作为实数类型的任务的语言。