2016-08-15 12 views
0

私はプログラミングには比較的新しいですが、だからこそ長い間lurkerされています。文字列からキーワードを読み込むときにif文をリファクタリングする

私は現在大学で勉強していますが、入力と出力が16進数でユーザーに表示される非常に基本的な電卓であるプログラムの作成に少し問題があります。

ほとんどのコードは良いですが、この特定のコードをリファクタリングする方法があるかどうか疑問に思っていたので、if文の大きなブロックを使用してオペレータそれに対応する関数に入りますか?

これは私が何をしたか、そして私がリファクタリングする必要があるもののスニペットです。

個人的には、私は入れ子にするか、おそらくこのためにループを利用するように感じますが、私は確かに知るための十分な知識がありません!

ありがとうございました。

int main() { 
    printf ("Type in an expression: "); 
    scanf ("%x %s %x", &a, op, &b); 
    if (strcmp (op, "add") == 0) 
    { 
     add(a, b); 
    } 
    if (strcmp (op, "sub") == 0) 
    { 
     sub(a, b); 
    } 
    if (strcmp (op, "and") == 0) 
    { 
     band (a, b); 
    } 
    if (strcmp (op, "or") == 0) 
    { 
     bor (a, b); 
    } 
    /* ...... and so on .....*/ 

} 
+0

文字列と関数ポインタを含む構造体の配列を持ち、その文字列と一致するようにそのループをループし、関数を呼び出すことができます。もう1つの方法は、ハッシュテーブルを作成することです。ハッシュテーブルは、操作数がかなり少ないので少し重いかもしれません。 –

+0

また、 'scanf'呼び出しにも注意してください。あなたは戻り値をチェックしておらず、scanfの ''%s "'は危険です。あなたのユーザがあなたのバッファをオーバーフローさせる可能性があります。 – PSkocik

答えて

1

else ifを使用してください。パースのこの種を行うには、「プロ」の方法は、(flexなど)レクサーとパーサジェネレータである(opマッチ"add"場合、それはまた"or"(など)に一致した場合、それはテストする最も確かに無意味です。)

bisonなど)を使用すると、すべての可能性に同時に対応するCコードを生成することができますが、それらは習得に少し時間がかかります。単純なものの場合は、if elsestrcmpの方がいいです。

+0

良い答え、あなたが言ったレクサーの方法を学ぶことに間違いはありません。面白そうです:)あなたが示唆したような場合には、私はちょうどelseを使用します。ありがとう! –

+0

@MackenzyBrownそれは強力です(あなたはむしろ簡単にCパーサーを作成できます)が、学習には時間がかかります。しかし 'strcmp'について' if else'を使って悪いと感じないでください。多くの "本当の" Cプロジェクトは、その種のコードでCLIオプション解析を処理します。 – PSkocik

関連する問題