argc在C程序中给出错误的值

tec*_*ury 3 c shell argc osx-mavericks

我想在运行时输入一些命令行参数.喜欢

./program abc def ghi
Run Code Online (Sandbox Code Playgroud)

argc在这种情况下将是4.没问题.但如果我这样做

./program abc def *
Run Code Online (Sandbox Code Playgroud)

甚至

./program * abc def
Run Code Online (Sandbox Code Playgroud)

变量argc给我一个远大于4的值.

在打印整个argv数组(不考虑第0个参数; ./program)作为字符串时,我会得到一个列表,其中前两个元素是abc,def而其他元素都是工作目录中包含的文件的文件名.

我正在尝试从K&R学习C语言.我试图制作一个RPN计算器,我们可以给出类似的表达式./program 2 4 *.

这是什么原因?或者我错了?

Sha*_*baz 9

Shell有一个名为globbing的功能,它可以扩展某些模式,例如*匹配文件.如果在当前目录中,您具有以下内容:

file1 file2 somethingelse dir1
Run Code Online (Sandbox Code Playgroud)

然后打电话:

any_program *
Run Code Online (Sandbox Code Playgroud)

将相当于:

any_program file1 file2 somethingelse dir1
Run Code Online (Sandbox Code Playgroud)

或者,如果你这样做:

any_program fi*
Run Code Online (Sandbox Code Playgroud)

它将相当于:

any_program file1 file2
Run Code Online (Sandbox Code Playgroud)

这是shell的一个特性.你的C程序表现良好.


由于贝壳是不同的,让我们假设您正在使用bash.要防止bash执行扩展,您应该引用参数.例如:

any_program "fi*"
Run Code Online (Sandbox Code Playgroud)

实际上会传递fi*给你的程序,而不会扩展到file1 file2.