3

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

关于我为什么需要它的解释:字符串在我的代码中不是以空结尾的(二进制兼容)。因此 sprintf("%s") 是无用的,除非我修复代码以了解如何呈现字符串。

感谢 quinmars 指出有办法通过 %s 打印字符串而不会被空终止。虽然它现在解决了需求,但我最终将需要 sprintf(或 snprintf)实现来实现使用变体的更高级别的功能。在到目前为止提到的其他内容中,在我看来 SQLite 实现是最好的。感谢 Doug Currie 指出这一点。

4

10 回答 10

5

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

...如果给出了精度,则不需要存在空字符;如果未指定精度或大于数组的大小,则数组必须包含终止 NUL 字符。

那么你有没有尝试过做类似的事情?

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

如前所述,我没有对其进行测试,如果它有效,那么它当然只有在字符串中没有 '\0'-byte 时才有效。

编辑:我现在已经测试过了,它可以工作了!

于 2009-03-04T14:09:31.240 回答
3

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

于 2009-03-04T13:28:29.497 回答
3

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

我同意 Dickon Reed 的观点,即您需要 snprintf,它包含在 SQLite 版本中。

于 2009-03-04T13:56:21.723 回答
2

我已经使用了这些家伙的源代码。它体积小、易于理解且易于修改(与 glib 和 libc 不同)。

于 2009-03-05T11:16:11.290 回答
1

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

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

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

于 2009-03-04T13:41:31.933 回答
1

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

如果您正在寻找为诸如编码语言、XML 或任何具有语法的东西创建解析器,我建议您查看 Lexers 和 Parser Generators(最常用的两个是FlexBison),它们几乎可以为您编写极其复​​杂的解析器代码(尽管工具本身有些复杂)。

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

于 2009-03-04T13:46:24.277 回答
1

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

于 2009-03-04T16:10:40.577 回答
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;
}
于 2009-03-07T14:10:27.050 回答
0

查看 Hanson 的C 接口:实现和技术。这是一本有趣的书,因为它是使用 Knuth 的文学编程技术编写的,并且它特别包含了一个基于snprintf().

于 2009-03-04T17:05:44.407 回答
0

Marco Paland设计了一个小型实现,我在这个存储库中几乎完成了一些问题。完整的 C99 sprintf/vsprintf/etc 大约需要 720 行代码。与sqlite的 3993 相比(尽管 SQLite 可以使用更少;它包含这个sqliteint.h标题和很多不相关的东西。)

于 2021-08-06T17:34:46.750 回答