2016-08-15 59 views
0

我對編程相對比較陌生,但在SO上一直是一個很長時間的潛伏者。當從字符串中讀取關鍵字時重構if語句

我目前在大學讀書,我在編寫一個基本上是非常基本的計算器的程序時遇到了一些麻煩,其中輸入和輸出以十六進制顯示給用戶。

大部分的代碼是很好去,但我想知道是否有一種方法來重構這個特定的代碼,所以它不(實質上)只是使用一大塊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

你可以有一個結構數組,它包含一個字符串和一個函數指針,然後遍歷它來查找匹配字符串,然後調用該函數。另一種方法是創建一個哈希表,可能有點沉重,因爲您的操作數量相當少。 –

+0

另外,請注意'scanf'調用。你不檢查它的返回值,並且scanf中的''%s''是危險的 - 你的用戶可能會溢出你的緩衝區。 – PSkocik

回答

1

您應該使用else if s。 (如果op匹配"add"這是最肯定毫無意義的測試,如果它也符合"or"(等)。)

「親」的方式做這樣的解析與詞法分析器(如flex)和解析器發電機(如bison),它們允許您生成可以同時匹配所有可能性的C代碼,但這需要花一點時間來學習。對於簡單的東西,你可以用if elsestrcmp

+0

好的答案,我一定會着眼於學習你提到的詞法分析器方法 - 它看起來很有趣:)同時,如果你喜歡你的建議,我會使用其他的方法。謝謝! –

+0

@MackenzyBrown功能強大(您可以輕鬆創建一個完整的C語言分析器),但需要一些時間來學習。不過,不要因'if else'對'strcmp'感到不好。許多「真正的」C項目處理CLI選項分析與這種類型的代碼。 – PSkocik