我正在研究K& R C书中的一个例子,它要求你基本上构建一个通过命令行参数获取输入的RPN计算器。我的解决方案基本上遍历给定的参数并吐出答案,但我注意到了一些事情:
如果我在没有单引号的情况下给出乘法字符(星号)'*'
,gcc会假定它是一个通配符输入,所以我的输入
$./rpn 5 10 *
给我输出
read 5
read 10
read rpn
read rpn.c
= 0
用单引号包装星号可以解决问题
$./rpn 5 10 '*'
read 5
read 10
read *
= 50
我的问题是有没有办法清理输入,以便我的程序不需要将星号包装在单引号中,或者这种行为是由更基本的东西引起的(例如Linux / POSIX / UNIX二进制执行和参数处理)?
答案 0 :(得分:7)
shell在执行程序之前扩展了glob。你引用glob不是因为GCC,而是因为shell。如果你不想要这种行为,那就使用一个不尊重globs的shell。
答案 1 :(得分:0)
输入
$./rpn "5 10 *"
""
和程序中的所有参数,您将获得argv[1]
下的所有参数,然后通过空格分隔解析该字符串。
通过这种方式,您需要以特殊方式处理任何通配符/特殊字符。