有人能指出我的源代码文件或者在C中具有良好,可重用的sprintf()实现的包,我可以根据自己的需要进行自定义吗?
解释我为什么需要它:字符串在我的代码中不会终止(二进制兼容)。因此,除非我修复代码以了解如何呈现字符串,否则sprintf(“%s”)是无用的。
感谢quinmars指出有办法通过%s打印字符串,而不会终止它。虽然它现在解决了这个问题,但我最终还是需要使用sprintf(或snprintf)实现更高级别的函数来使用变体。到目前为止,在我看来,SQLite实现是最好的。感谢Doug Currie指出它。
答案 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个最常用的是Flex和Bison)可以为你编写非常复杂的解析器代码(尽管工具本身有点复杂)。
否则,您可以在Visual Studio附带的源文件中找到它的代码(至少2005年和2008年,其他人可能拥有它,但那些肯定会有)。
答案 6 :(得分:1)
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
标头以及许多不相关的内容。)