题
有人能指出我的源代码文件或者在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)是子目录之一 这是为了骑行。
所以你可以在那里查找。 我不知道会有多大帮助...
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接口。