【问题标题】:Passing * as a command line argument传递 * 作为命令行参数
【发布时间】:2013-07-15 12:48:31
【问题描述】:

我编写了一个 C 程序,通过将表达式作为命令行参数传递来评估反向抛光符号,但是当我传递 *(用于乘法)时,它传递了该文件夹中的所有文件名。

例如我通过了这个:

./rpn 10 20 30 + *

当我打印所有参数时,结果是,

 10
 20
 30
 +
 gcd
 gcd.c
 gcd.c~
 rpn
 rpn.c
 rpn.c~
 swapmacro
 swapmacro.c argc :12

【问题讨论】:

  • 您使用什么程序将* 传递给您的程序?听起来您只是不知道如何使用您正在使用的任何程序来启动您的 C 程序。
  • 我正在使用 ubuntu 12.04 终端来运行我的程序,你问的是这个吗?
  • 它被称为 文件名扩展:让我们在你的 shell 中试试这个代码 for i in *;do echo $i;done;
  • 没有。终端必须显示某个程序的输出,并且您必须将输入发送到某个程序。我在问那个程序是什么。我敢打赌,如果您不知道那是什么程序,那么您也不知道如何使用它。这很好值得学习。您正在使用的程序通常称为“shell”。你应该明智地选择你使用的 shell,而不是盲目地接受你平台的默认值,你应该了解所有你可以了解的内容。
  • @ParagJain 是的,我想用这个小代码来演示一下,你可能喜欢阅读3.5 Shell Expansions它被称为文件名扩展。

标签: c command-line-arguments postfix-notation


【解决方案1】:

您需要转义 * 例如通过像"*" 一样引用它或像\* 一样转义它

* 的扩展由 shell 完成(在启动程序之前)。阅读例如Advanced Bash Scripting guide

【讨论】:

  • 另外,使用 ~ 作为参数将扩展到当前目录。
  • @aaronvan:不,错。 ~ 扩展到 home 目录($HOME 通常是)
【解决方案2】:

这不是 C 语言问题。您正在使用 Bash(或一些等效的 shell),其中 * 会自动扩展(在它到达您的程序附近之前)。您需要执行以下操作:

./rpn 10 20 30 + "*"

【讨论】:

  • 这行得通,谢谢。但是我可以做些什么来阻止它,我正在运行 ubuntu 终端,我怎么知道它会在特定环境中扩展还是不扩展?
猜你喜欢
  • 2015-04-11
  • 2016-02-07
  • 2016-10-10
  • 1970-01-01
  • 2023-02-10
  • 2016-03-25
  • 1970-01-01
  • 2017-12-17
  • 2018-04-29
相关资源
最近更新 更多