我想在运行时输入一些命令行参数。像
./program abc def ghi
在这种情况下, argc
将为4。没问题。但是如果我做的话
./program abc def *
甚至
./program * abc def
变量argc
给我一个远大于4的值。
在打印整个argv
数组(不考虑第0个参数; ./program
)作为字符串时,我会得到一个列表,其中前两个元素是abc
和{{1}其他都是工作目录中包含的文件的文件名。
我正在尝试从K& R学习C语言。我正在尝试制作一个RPN计算器,我们可以在其中提供def
等表达式。
这是什么原因?或者我在某处错了?
答案 0 :(得分:9)
Shell有一个名为globbing的功能,可以将某些模式(例如*
)扩展到匹配的文件。如果在当前目录中,您有以下内容:
file1 file2 somethingelse dir1
然后打电话:
any_program *
将等同于:
any_program file1 file2 somethingelse dir1
或者如果你这样做:
any_program fi*
它将等同于:
any_program file1 file2
这是shell的一个功能。你的C程序表现良好。
由于shell不同,我们假设您正在使用bash
。为防止bash
执行扩展,您应引用该参数。例如:
any_program "fi*"
实际上会将fi*
传递给您的计划,而不会将其扩展为file1 file2
。
答案 1 :(得分:3)
命令行解释程序在将参数传递给程序之前将*
字符处理为通配符,就像键入DIR *
时一样。
简单的解决方案是设计一个没有被解释的有意义的参数。
答案 2 :(得分:2)
如果您正在使用bash,请使用-f
开关启动shell以关闭*
bash -f
答案 3 :(得分:0)
您可以通过将*放入单引号来阻止*扩展为文件名,即
./program 2 4 '*'
这样你的程序就会收到3个输入参数,其值为“2”,“4”和“*”就C字符串而言。