2

私は最近、いくつかの基本的なコマンドライン プログラムを書いています (この夏の間、スキルを磨き続けたいと思ってprintfいます) scanf。私は素晴らしい C プログラマーではなく、printf/scanfとその不安定性 (またはさらに悪いことにfgets、その同類) に入らなければならないことは、私を快適な環境に置いているわけではありません (この理由から、私は が大好きNSLogで、その快適なデフォルトを使用しています)名前空間とその自動NSStringおよびNSObject解析)。

しかし、残念なことに、NSLog には対応する関数がなく、多くの余分な「ジャンク」(時間、関数名など、最後に改行を伴う) が出力され、多くの目的が無効になります。私の使用では。そこで、私は別の種類のプログラミング演習に腰を下ろし、自分のニーズを満たす printf と scanf を置き換える関数を作成することにしました。

NSInput.hそして出来上がり、 2 つの関数を含む独自のファイルを思いつきました:NSPrint()NSScan(). これら 2 つの関数は、printf と scanf をモデルにしていますが、handle もモデル化していNSStringます。私はここで神聖な名前空間を踏んでいることを知っていますが、抵抗できませんでした (IFPrintそして、IFScanただひどく聞こえます!)。

現在、動作するコード (ここでソースを見つけることができます) があることを本当に嬉しく思いますが、それが効率的でないことはわかっています (しかし、驚いたことに、Xcode 4 の LLDBNSPrintよりも数倍効率的です。printfしかし、それは論外です)。機能をより良く、より効率的にする方法についてアドバイスが必要です。NSScanたとえば、受信した を に変換しva_listNSPointerArrayを使用NSScannerしてフォーマットと入力文字列をスキャンするので、改善の余地がたくさんあることがわかります。

基本的に、私が知りたいのは、私が犯した明らかな間違いで、修正できるものと修正する必要があるものはありますか? 私が見逃した大きなものはありますか?甘やかされて、 and の使用に戻る必要がprintfありscanfますか? 教えてください、私はここで入力を探しています (しゃれは意図されていません!)...

前もって感謝します!

4

1 に答える 1

3

私の考え:

  • それらをNSxxxxxと呼ばないでください。NSはCocoaとFoundationのために予約されています。
  • 両方の関数を変更して受け入れるFILE*必要があります。つまり、インターフェイスをモデル化しfprintf()fscanf()柔軟性を高める必要があります。
  • あなたが使用した場合、あなたのprintf関数はおそらくより良いでしょうfputs()

例えば

void NSFPrint (FILE* fp, NSString *format, ...) 
{
    // Create the variable argument list.
    va_list args;
    va_start(args, format);

    // Using NSString, parse the argument list and convert it to a C string.
    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], fp);
     va_end(args);
}
  • UTF-8以外のエンコーディングでの入出力のサポートを追加することを検討してください。
  • scanfの置換では、stdinでCバッファIOとUnixバッファなしIOが混在しています。これは悪いかもしれません。
  • scanf置換は、必要がない場合でも、行の終わりまで読み取ります。注意深くチェックしていませんが、スキャン形式が行全体を消費しない場合は、入力を破棄しているように見えます。これは悪いかもしれません。
于 2010-08-09T09:05:48.793 に答える