2009-03-04 73 views
3

任何人都可以指向一個源代碼文件或者一個包中有一個很好的,可重用的C中的sprintf()實現,我可以根據自己的需要進行自定義?可定製的sprintf實現()

爲什麼我需要它的解釋:在我的代碼中字符串不是空的(與二進制兼容)。因此,sprintf(「%s」)是無用的,除非我修復代碼以瞭解如何呈現字符串。

感謝quinmars指出有通過%s打印字符串的方法,而不是以null結尾。雖然它現在解決了需求,但我最終需要使用sprintf(或snprintf)實現更高級別的使用變體的函數。除了其他提到的到現在爲止,在我看來,SQLite實施是最好的。感謝Doug Currie指出了它。

+0

你能解釋一下你想要什麼sprintf的修改()?這對我來說是一個紅旗,因爲聽起來好像有一個比複製一個複雜的API函數更好的解決方案。 – Thorsten79 2009-03-04 13:28:41

回答

5

我還沒有嘗試過,因爲我沒有一個編譯器在這裏,但閱讀手冊頁,它看起來像,你可以通過一個精密的「%s」的:

.. 。如果給出精度,則不需要空字符 ;如果未指定精度,或者數組大小大於 ,則該數組必須包含終止的 NUL字符。

所以你有沒有試過這樣做?

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

至於說我沒有測試它,如果它的工作原理,它的工作原理,當然前提是你有字符串的內部沒有「\ 0'字節。

編輯:我已經測試過它,它的工作原理!從glibc的

+0

正是我在看什麼。 – plinth 2009-03-04 14:19:44

1

我想要修改sprintf的唯一原因就是擴展它,擴展它的唯一原因是當你在路上編寫某種解析器。

如果你想創建一個類似於編碼語言,XML或任何語法的解析器,我建議你看看Lexers和Parser Generators(最常用的兩個是FlexBison)它可以爲你編寫非常複雜的解析器代碼(儘管這些工具本身有點複雜)。否則,您可以在Visual Studio附帶的源文件中找到它的代碼(至少在2005年和2008年,其他人可能擁有它,但這兩個絕對可以)。

3

作爲SQLite here的一部分,有一個很好的公共域實現。

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

1

的snprintf是通過鉤/處理機制定製

0

看看Hanson的C Interfaces: Implementations and Techniques。這是一本有趣的書,它使用Knuth的Literate Programming技術編寫,它特別包含基於snprintf()的可擴展格式化I/O接口。

+0

這是一本很好的書,但它使用引擎蓋下的`sprintf`來完成繁重的工作 – 2010-10-20 12:14:45

2

我已經使用this傢伙的源代碼。 它很小,易於理解和修改(與glib & libc相對)。

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