2012-01-02 6 views
1

私は、実行可能ファイルを開き、見つかった特定の印刷可能な文字列を吐き出す小さなユーティリティを書きました。この最後のif文を削除することはできますか?

これはうまくいきますが、私はこれらのif文の1つを削除する方法があるのだろうと思いましたか?私はどのように私は3つの異なるifステートメントが必要ではないが、私は現在の構造でそれを行うことができませんがわからない私の条件を整理することができたのを見てしようとしていた。

#include <stdio.h> 

#define MAX_STR_SIZE 0x666 
#define MIN_STR_SIZE 0x5 

int main(int argc, char** argv) 
{ 
    int ch; 
    int pos = 0; 
    FILE* f; 
    char buff[MAX_STR_SIZE]; 

    if (argc>1 && (f=fopen(argv[1], "rb"))) 
    { 
     while ((ch=getc(f)) != EOF) 
     { 
      if (ch >= ' ' && ch <= 'z') // is printable char? 
      { 
       buff[pos++] = ch; 
       buff[pos] = '\0'; 
       if (pos == (MAX_STR_SIZE-1)) // is current string > max length? 
       { 
        printf("%08x: %s\n", ftell(f), &buff[0]); 
        pos = 0; 
       } 
      } 
      else // non-printable char, print any string in buffer and start over 
      { 
       if (pos > (MIN_STR_SIZE - 1)) // is current string > min string? 
       { 
        printf("%08x: %s\n", ftell(f), &buff[0]); // print current string 
       } 
       pos = 0; 
      } 
     } 

     if (pos > (MIN_STR_SIZE - 1)) // any remaining string left to print? 
     { 
      printf("%08x: %s\n", ftell(f), &buff[0]); 
     } 

     fclose(f); 
    } 
} 
+1

、この質問にはCの++はありませんが、あなたのよう – Xeo

+1

慎重なコーダーであると思われますが、あなたの "印刷可能な"テストでは、印刷可能な文字の範囲が連続していて、開始点と終了点が固定されていると誤って仮定しています。 'ü'という文字)、 'ctype.h'から' isprint() 'を使うことを勧めます。したがって、実際に印刷可能な文字を構成するホスト環境に頼ってください。 – Philip

答えて

3

私は、このバージョンは、if文(または少なくともそれらを一緒に崩壊のほとんどなくなり信じる:。

Cに再びタグ付け
#include <stdio.h> 

#define MAX_STR_SIZE 0x666 
#define MIN_STR_SIZE 0x5 

int main(int argc, char** argv) 
{ 
    int ch; 
    int pos = 0; 
    FILE* f; 
    char buff[MAX_STR_SIZE]; 

    if (argc>1 && (f=fopen(argv[1], "rb"))) 
    { 
     while ((ch = getc(f)) != EOF) 
     { 
      pos = 0; 
      while (ch >= ' ' && ch <= 'z' && pos < (MAX_STR_SIZE-1)) { 
       buff[pos++] = ch; 
       ch = getc(f); 
      } 
      if (pos > (MIN_STR_SIZE - 1)) // is current string > min string? 
      { 
       buff[pos] = '\0'; 
       printf("%08x: %s\n", ftell(f), buff); 
      } 
     } 

     fclose(f); 
    } 
} 
+1

if(ch> = '' && ch <= 'z')はもはや必要なのでしょうか?それなしではうまくいくようです。 – KingNestor

+0

はい、それは内部ループのEOFのチェックと同様に不要でした。私はこれらの変更を反映するようにコードを更新しました。 – DRH

+0

優秀!ありがとう、これははるかに良いです。私はまた、Nawazによって指摘されたisprint関数の使用に切り替えました。 – KingNestor

3

最後のifは、コードの現在のロジックに必要なようです。

ただし、コードのチェックが完全ではありません。文字が印刷可能かどうかを確認するのに、isprint()機能を使用してみませんか?このような何か:

if (isprint(c)) // is printable char? 
{ 
    //c is printable 
} 
関連する問題