2010-02-09 148 views
5

我在C中做了一個小計算器,並且我想將簡單的算術公式傳遞給我的程序。但它真的不喜歡我將字符'*'傳遞給我的程序。 爲什麼不呢? 我該如何解決這個問題,而不需要將asterix改成別的東西? 謝謝*在Linux命令行上

回答

9

字符*是擴展匹配文件名的外殼觸發器。

有幾種方法來對付它:

  • 逃避它打字mycalc 5 \* 3
  • 地點時報價整體表現,並確保計算器的解析器這樣工作:myprog "5 * 3"
  • 不要使用命令行:改爲使用您自己的輸入。
+3

OR:總是在空目錄:) – 2010-02-09 19:44:08

+2

有趣的想法運行它。它可以作爲專用*計算目錄*銷售。或者可能是*安全的計算環境*。 :-) – wallyk 2010-02-09 20:05:23

+0

取決於外殼。雖然默認情況下,Bash在沒有任何匹配的情況下保留一個未展開的glob,但它可以配置爲刪除glob('shopt -s nullglob')或使整個命令失敗('shopt -s failglob')。在其他shell中,例如'tcsh',最後一個行爲是默認行爲。 – ephemient 2010-02-09 20:13:14

3

Linux命令shell(bash,tcsh,ksh,whatever)會在您的程序看到它之前將'*'展開成文件列表。關於這一點你可以做的很少 - 你可以讓用戶把星號放在單引號中,或者用反斜槓轉義,或者用'x'代替。沒有特別用戶友好的。

7

*得到擴展以匹配當前目錄中的所有文件(這稱爲「globbing」)。您需要引用或轉義*,或使用不同的符號。

1

*評估爲「bash下的當前目錄中的所有內容」。然而,.正常工作,並經常用作數學乘法的符號 - 特別是標量乘法。

6

*將調用通配,並擴大到您所在的目錄下的所有文件,只是引用*和運行您的程序像

./yourprogram '10 * 10'

./yourprogram 10 '*' 10

隨着第一種情況,你的程序只會傳遞1個參數,argv [1]將是字符串「10 * 10」,第二種情況下你會通過3個參數

0

的「計算」的應用程序,你可以從DEB檢索存儲庫的apt-get安裝的計算可以評估3 * 3而不是3 * 3

-1

嘗試逃離它,星號在C

特殊字符

更改爲* *

2

未提及最後一項技術。可以引用/轉義每一種用法,可以關閉通配符。這樣一來,如果你想用計算器了很多,你沒有逃跑每次使用:

# For bash 
set -o noglob 

# For csh/tcsh 
set noglob 

# Now that noglob is set, you can safely use * 
calc 3 * 3 
+0

+1 - 最好在包裝腳本中運行'calc',以便用戶可以享受更自然的語言輸入。從文件管道輸入時也非常有用。 – 2010-02-10 06:49:23