可自定义的sprintf()实现

时间:2009-03-04 13:26:13

标签: c printf

有人能指出我的源代码文件或者在C中具有良好,可重用的sprintf()实现的包,我可以根据自己的需要进行自定义吗?

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

感谢quinmars指出有办法通过%s打印字符串,而不会终止它。虽然它现在解决了这个问题,但我最终还是需要使用sprintf(或snprintf)实现更高级别的函数来使用变体。到目前为止,在我看来,SQLite实现是最好的。感谢Doug Currie指出它。

10 个答案:

答案 0 :(得分:5)

我没有尝试过,因为我这里没有编译器,但是阅读手册页,看起来你可以传递'%s'的精度:

  

...如果给出精度,则不为空字符                需要在场;如果未指定精度,或者更大                比数组的大小,数组必须包含一个终止                NUL角色。

那你有没有试过这样的事情呢?

snprintf(buffer, sizeof(buffer), "%.*s", bstring_len, bstring);

如上所述我没有测试它,如果它有效,它当然只有在字符串内没有'\ 0'字节时才有效。

编辑:我现在已经测试过了,它确实有效!

答案 1 :(得分:3)

你应该真的在寻找snprintf(sprintf尊重输出缓冲区大小);谷歌建议http://www.ijs.si/software/snprintf/

答案 2 :(得分:3)

作为SQLite here的一部分,有一个很好的公共域实现。

我同意Dickon Reed你想要的snprintf,它包含在SQLite版本中。

答案 3 :(得分:2)

我使用了this个人源代码。 它小巧,易懂,易于修改(与glib& libc相反)。

答案 4 :(得分:1)

根据此链接 - http://www.programmingforums.org/thread12049.html

  

如果你有完整的gcc发行版,   C库的源代码(glib或   libc)是子目录之一   这是为了骑行。

所以你可以在那里查找。 我不知道会有多大帮助...

答案 5 :(得分:1)

我想要修改sprintf的唯一原因是扩展它,扩展它的唯一原因是当你正在编写某种解析器的时候。

如果您希望为编码语言,XML或任何具有语法的内容创建解析器,我建议您查看Lexers和Parser Generators(其中2个最常用的是FlexBison)可以为你编写非常复杂的解析器代码(尽管工具本身有点复杂)。

否则,您可以在Visual Studio附带的源文件中找到它的代码(至少2005年和2008年,其他人可能拥有它,但那些肯定会有)。

答案 6 :(得分:1)

来自glibc的

snprintf可通过钩子/处理程序机制自定义

答案 7 :(得分:1)

只是一个想法...... 例如:

#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;
}

答案 8 :(得分:0)

看看汉森的C Interfaces: Implementations and Techniques。这是一本有趣的书,它是使用Knuth的Literate Programming技术编写的,它特别包括基于snprintf()的可扩展格式化I / O接口。

答案 9 :(得分:0)

Marco Paland 设计了一个小型实现,我几乎在 this repository 中解决了一些问题。完整的 C99 sprintf/vsprintf/etc 大约有 720 行代码。与 sqlite 的 3993 相比(尽管 SQLite 可以使用的少得多;它包含这个 sqliteint.h 标头以及许多不相关的内容。)