【问题标题】:argc giving erroneous value in C programargc 在 C 程序中给出错误的值
【发布时间】:2015-05-29 06:52:04
【问题描述】:

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

./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 * 之类的表达式。

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

【问题讨论】:

  • 查找“globbing”顺便说一句:尝试 /bin/echo abc def * ,而不是您的程序。
  • * 可能由你的 shell 解释并替换为当前目录中的所有文件。
  • 谢谢。但是解决方法是什么?
  • 这是您的操作系统在传递参数之前所做的事情。您可能应该用相关的操作系统标记这个问题(我猜是 Linux)。附带说明一下,避免使用 K&R,它已经完全过时,充满了错误和糟糕的编程习惯。
  • @Lundin,不是操作系统,而是外壳。您可以在 cygwin 下运行 bash 并获得相同的行为。

标签: c shell osx-mavericks argc


【解决方案1】:

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

file1 file2 somethingelse dir1

然后调用:

any_program *

将等同于:

any_program file1 file2 somethingelse dir1

或者如果你这样做:

any_program fi*

相当于:

any_program file1 file2

这是外壳的一个特性。您的 C 程序表现良好。


由于 shell 不同,假设您使用的是bash。为了防止bash 执行扩展,您应该引用该参数。例如:

any_program "fi*"

实际上会将fi* 传递给您的程序,而不会将其扩展为file1 file2

【讨论】:

  • 是的,你是对的,我正在运行 bash,我尝试了这个表达式。 : ./program abc def "*" 它给 argc 等于 4 好吧!
  • @tectonicfury,通配符是一个非常有用的功能。你只需要学习它,这样你就可以有效地使用它,而不会像你一样遇到问题。
  • 我在某个时候使用过 linux,以前我会执行 'rm *.txt' 或 'ls *.txt' 之类的命令,所以我很熟悉这种行为,但我认为它不会即使我正在运行 ac 程序,也要这样做..
  • @tectonicfury、rmls 也只是 c 程序 ;) 无论如何,我所说的底线是 * 由外壳扩展,应用程序(无论语言如何)不知道参数来自扩展的*
  • 非常感谢您提供此信息,现在我清楚了。完美的。我需要学习很多东西,哈哈。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    ./program 2 4 '*'
    

    这样,您的程序将接收 3 个输入参数,其值为 C 字符串形式的“2”、“4”和“*”。

    【讨论】:

      【解决方案4】:

      如果您使用 bash,请使用 -f 开关启动 shell,以关闭 * 等内容的扩展

      bash -f

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 1970-01-01
        相关资源
        最近更新 更多