以下は、私が受験した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