2010-02-09 119 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