質問

ソースコードファイルや、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つは間違いなくあります)。

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