C sprintf()的可定制实现
有谁能告诉我一个源代码文件或一个包,它有一个很好的、可重用的sprintf()C实现,我可以根据自己的需要进行定制 解释我为什么需要它:字符串在我的代码中不是以null结尾的(二进制兼容)。因此,除非我修改代码以理解如何呈现字符串,否则sprintf(“%s”)是无用的C sprintf()的可定制实现,c,printf,C,Printf,有谁能告诉我一个源代码文件或一个包,它有一个很好的、可重用的sprintf()C实现,我可以根据自己的需要进行定制 解释我为什么需要它:字符串在我的代码中不是以null结尾的(二进制兼容)。因此,除非我修改代码以理解如何呈现字符串,否则sprintf(“%s”)是无用的 感谢quinmars指出有一种方法可以通过%s打印字符串,而不会以null结尾。虽然它现在解决了需求,但我最终需要sprintf(或snprintf)实现,以实现使用变体的更高级别函数。在目前提到的其他方法中,我认为SQLite
感谢quinmars指出有一种方法可以通过%s打印字符串,而不会以null结尾。虽然它现在解决了需求,但我最终需要sprintf(或snprintf)实现,以实现使用变体的更高级别函数。在目前提到的其他方法中,我认为SQLite实现是最好的。感谢Doug Currie指出这一点。您真的应该寻找snprintf(关于输出缓冲区大小的sprintf);谷歌建议。根据此链接-: 如果您拥有完整的gcc发行版, C库的源代码(glib或 libc)是子目录之一 那是搭便车来的 所以你可以在那里查。
我不知道这会有多大帮助…我想修改sprintf的唯一原因是扩展它,而扩展它的唯一原因是在编写某种解析器的过程中 如果您希望为编码语言、XML或任何具有语法的东西创建解析器,我建议您研究lexer和解析器生成器(最常用的两个是and),它们可以为您编写极其复杂的解析器代码(尽管工具本身有些复杂)
否则,您可以在VisualStudio附带的源文件中找到它的代码(至少2005年和2008年,其他人可能有,但那两个肯定有)。SQLite有一个很好的公共域实现
我同意Dickon Reed的说法,您需要snprintf,它包含在SQLite版本中。我没有尝试过它,因为我这里没有编译器,但是阅读手册页,看起来您可以传递“%s”的精度: 。。。如果给定精度,则没有空字符 需要在场;如果未指定精度,或精度更高 大于数组的大小时,数组必须包含终止字符 NUL字符 你有没有试过这样做
snprintf(buffer, sizeof(buffer), "%.*s", bstring_len, bstring);
如前所述,我还没有对它进行测试,如果它能工作,那么它当然只能在字符串中没有“\0”字节时工作
编辑:我现在已经测试过了,可以正常工作了 glibc的snprintf可以通过hook/handler机制进行定制。这是一本有趣的书,因为它是使用Knuth的技术编写的,它特别包括一个基于
snprintf()
的可扩展格式化I/O接口,我使用了guys的源代码。
它小巧、易懂、易于修改(与glib&libc相反)。只是一个想法。。。
例如:
#包括
#包括
#包括
intsprintf(字符*str,常量字符*格式,…)
{//在继续使用标准输入之前,您可以在此处重新调整输入
va_列表参数;
va_开始(参数,格式);
vsprintf(str,format,args);//这仍然使用标准格式
va_端(args);
return 0;//如果需要,可以在return之前重新定义它。。。
}
内部主(空)
{
charh[20];
sprintf(h,“hei%d”,10);
printf(“t%s\n”,h);
getchar();
返回0;
}
您能解释一下您想在sprintf()中修改什么吗?这对我来说是个危险信号,因为听起来有一个比复制复杂的API函数更好的解决方案。这正是我所看到的。这是一本好书,但它在引擎盖下使用了sprintf
来完成繁重的工作
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
int sprintf(char * str, const char * format, ... )
{// Here you can redfine your input before continuing to compy with standard inputs
va_list args;
va_start(args, format);
vsprintf(str,format, args);// This still uses standaes formating
va_end(args);
return 0;// Before return you can redefine it back if you want...
}
int main (void)
{
char h[20];
sprintf(h,"hei %d ",10);
printf("t %s\n",h);
getchar();
return 0;
}