質問
ソースコードファイルや、Cでsprintf()の適切で再利用可能な実装があり、自分のニーズに合わせてカスタマイズできるパッケージを誰かが指し示すことはできますか?
私がそれを必要とする理由の説明:文字列はコード内でnullで終了していません(バイナリ互換)。したがって、文字列のレンダリング方法を理解するためにコードを修正しない限り、sprintf("%s")は役に立ちません。
nullで終了せずに%sを介して文字列を印刷する方法があることを指摘してくれたquinmarsに感謝します。現時点では要求を解決していますが、最終的にはバリアントを使用する高レベルの関数のためにsprintf(またはsnprintf)実装が必要になります。これまで述べてきた中で、SQLiteの実装が最適であるように思えます。それを指摘してくれたダグ・カリーに感謝します。
解決
ここにはコンパイラーがないため、試していませんが、manページを読むと、 '%s'の精度を渡すことができるように見えます:
...精度が指定されている場合、null文字はありません 存在する必要があります;精度が指定されていない場合、またはそれより大きい場合 配列のサイズよりも、配列には終端が含まれている必要があります NUL文字。
では、そのようなことをしようとしましたか?
snprintf(buffer, sizeof(buffer), "%.*s", bstring_len, bstring);
私はそれをテストしていないと言ったように、もしそれが機能するなら、文字列の中に '\ 0'-byteがない場合にのみ機能します。
編集:今テストしましたが、動作します!
他のヒント
snprintf(出力バッファサイズを考慮したsprintf)を本当に探しているはずです。 googleは http://www.ijs.si/software/snprintf/ を提案しています。
SQLiteの一部として優れたパブリックドメイン実装がありますここ。
SQLiteバージョンに含まれているsnprintfが必要であることにDickon Reedに同意します。
this のソースコードを使用しました。 小さく、理解しやすく、簡単に変更できます(glib& libcとは対照的です)。
このリンクによれば、 http://www.programmingforums.org/thread12049.html:
完全なgccディストリビューションがある場合、 Cライブラリのソース(glibまたは libc)はサブディレクトリの1つです それは乗車のために来ます。
それで、そこを調べることができます。 どれほど役立つかわからない...
sprintfを変更したいと考える唯一の理由は、sprintfを拡張することであり、拡張する唯一の理由は、何らかのパーサーを記述する途中です。
コーディング言語、XML、または実際に構文を持つものなどのパーサーを作成する場合は、レクサーとパーサージェネレーター(最もよく使用される2つは Flex および Bison )。パーサー用の非常に複雑なコードをほとんど書くことができます(ただし、ツール自体はやや複雑です)。
それ以外の場合、Visual Studioに含まれているソースファイルでコードを見つけることができます(少なくとも2005と2008、他の人が持っている可能性がありますが、これら2つは間違いなくあります)。
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インターフェイスが含まれています。