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

时间:2015-03-25 14:25:57

标签: c shell osx-mavericks argc

我想在运行时输入一些命令行参数。像

./program abc def ghi
在这种情况下,

argc将为4。没问题。但是如果我做的话

./program abc def *

甚至

./program * abc def

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

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

我正在尝试从K& R学习C语言。我正在尝试制作一个RPN计算器,我们可以在其中提供def等表达式。

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

4 个答案:

答案 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字符串而言。