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

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

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

有帮助吗?

解决方案

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

  

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

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

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

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

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

其他提示

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

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

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

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

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

  

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

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

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

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

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

来自glibc的

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

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

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

查看Hanson的 C接口:实现和技术。这是一本有趣的书,它是使用Knuth的 Literate Programming 技术编写的,它特别包括基于 snprintf()的可扩展格式化I / O接口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top