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

argc giving erroneous value in C program

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

./program abc def ghi

argc 在这种情况下为 4。这没问题。但如果我这样做

./program abc def *

甚至

./program * abc def

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

在将整个 argv 数组(撇开第 0 个参数;./program)打印为字符串时,我得到一个列表,其中前两个元素是 abcdef等都是工作目录下包含的文件的文件名。

我正在尝试从 K&R 学习 C。我试图制作一个 RPN 计算器,我们可以在其中给出像 ./program 2 4 *.

这样的表达式

这是什么原因?还是我哪里错了?

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

命令行解释器在将参数传递给您的程序之前将 * 字符作为通配符处理,就像您键入 DIR *.

时所做的一样

简单的解决方案是设计一个不被解释的有意义的参数。

您可以通过将 * 放在单引号中来防止 * 扩展为文件名,即

./program 2 4 '*'

这样您的程序将收到 3 个输入参数,其值为“2”、“4”和“*”(就 C 字符串而言)。

如果您正在使用 bash,请使用 -f 开关启动 shell 以关闭诸如 *

之类的扩展

bash -f