grepに関するテスト質問

grepに関するテスト質問

以下は、私が受験したLPIC-1練習試験の試験問題です。正解はAです。私は何が起こっているのか本当に混乱しています。あまり難しいことでなければ、Aが正解なのか教えてくれる人はいますか?

int double(int n)
    { /* int arg, int return */
       return n*2;
    }
    char hello(int n)
    { /* int arg, char return */
       printf("hello %i\n", n);
    }
    int five()
    { /* no args, int return */
       return 5;
    }
    int        triple(int n, int other, char nonsense)
    { /* int arg, int return */
       return n*3;
    }

Cソースファイルを正しく解析するには、洗練されたパーサー(Cコンパイラーに組み込まれたパーサーなど)が必要です。それにもかかわらず、正規表現を使用すると、多くのプログラム構造のおおよその説明を合理的に提供できます。次の検索のうち、intを最初の引数として受け入れ、intを返す(そしてよく偽の肯定を生成しない)、ほとんどのC関数を探す検索は何ですか?この展覧会には、注釈付きの複数の一致関数と不一致関数(非Cプログラマー用)を含むCコードの断片が含まれています。

  • ㅏ。grep -E "int[ \t]+\w+[ \t]*\([ \t]*int" *.c
  • 雨。grep -E "^int\w+[A-Za-z_]+\w*\(\w*int" *.c
  • 氏。grep -E "int.+\([ \t]+int.*\) " *.c
  • ディ。grep -E "int[ \t]+[A-Za-z_][ \t]+\(int" *.c

引用:http://gnosis.cx/publish/programming/exam101.html- 特にこの質問は - 1.3/7/1。

ベストアンサー1

テストするときに実際にgrep入力データに対してコマンドを実行できないと仮定すると、式を見ていくつかの推測が必要です。

逆順で確認してください。

  • ディ。grep -E "int[ \t]+[A-Za-z_][ \t]+\(int" *.c

    これは、関数名が単一文字()より長くなることを許可しません。関数[A-Za-z_]名と引数リストの間に少なくともスペース、バックスラッシュ、またはスペースが必要であると仮定します。t

    一致int a (intまたはint at(int一致しませんint foo(int

  • 氏。grep -E "int.+\([ \t]+int.*\) " *.c

    これは引数リストが少なくとも空白、バックスラッシュ、またはt

    一致int foo( intまたはint foo(tint一致しませんint foo(int

  • 雨。grep -E "^int\w+[A-Za-z_]+\w*\(\w*int" *.c

    これは戻り値の型と関数名の間にスペースを入れず、int関数定義が行の先頭から始まると仮定します(例コードにはインデントされた関数定義が含まれています)。

    一致intfoo(intが一致しませんint foo(int

  • ㅏ。grep -E "int[ \t]+\w+[ \t]*\([ \t]*int" *.c

    これは一致を許可する唯一の関数ですが、int foo(int無効な関数名とも一致します。int 000(intたとえば、与えられた4つの正規表現の中で最高の正規表現です。

また、この質問ではgrep一致のためにGNUを想定しています\w。標準grep実装を使用することをお勧めします。[[:alnum:]_]スペースまたはタブ(スペース、バックスラッシュ、または一致)を一致させる代わりに使用する必要があります。\w[[:blank:]][ \t]t

おすすめ記事