Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C sprintf()的可定制实现_C_Printf - Fatal编程技术网

C sprintf()的可定制实现

C sprintf()的可定制实现,c,printf,C,Printf,有谁能告诉我一个源代码文件或一个包,它有一个很好的、可重用的sprintf()C实现,我可以根据自己的需要进行定制 解释我为什么需要它:字符串在我的代码中不是以null结尾的(二进制兼容)。因此,除非我修改代码以理解如何呈现字符串,否则sprintf(“%s”)是无用的 感谢quinmars指出有一种方法可以通过%s打印字符串,而不会以null结尾。虽然它现在解决了需求,但我最终需要sprintf(或snprintf)实现,以实现使用变体的更高级别函数。在目前提到的其他方法中,我认为SQLite

有谁能告诉我一个源代码文件或一个包,它有一个很好的、可重用的sprintf()C实现,我可以根据自己的需要进行定制

解释我为什么需要它:字符串在我的代码中不是以null结尾的(二进制兼容)。因此,除非我修改代码以理解如何呈现字符串,否则sprintf(“%s”)是无用的


感谢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;
}