argv:消毒通配符

我正在做一个K&R C书中的例子,它要求你基本上build立一个RPN计算器,它通过命令行参数来input。 我的解决scheme基本上遍历给定的参数,并吐出答案,但我注意到了一些事情:

如果我给乘法字符(星号) '*'没有单引号,gcc认为是一个通配符input,所以我的input

 $./rpn 5 10 * 

给我一个输出

 read 5 read 10 read rpn read rpn.c = 0 

用单引号包裹星号可以解决问题

 $./rpn 5 10 '*' read 5 read 10 read * = 50 

我的问题是有没有办法消毒input,以便我的程序不需要用单引号包裹星号,或者是由更基本的东西(例如Linux / POSIX / UNIX二进制执行和参数处理)引起的这种行为?

Solutions Collecting From Web of "argv:消毒通配符"

在执行程序之前,shell正在扩展glob。 你引用glob不是因为GCC,而是因为shell。 如果你不想要这个行为,那么使用一个不尊重globs的shell。

给作为输入

 $./rpn "5 10 *" 

""和程序中的所有参数,你会得到argv[1]下的所有参数,然后通过空间分离来解析该字符串。

通过这种方式,你需要以特殊的方式处理任何通配符/特殊字符。