尝试从命令行获取星号 * 作为对 main 的输入

Trying to get an asterisk * as input to main from command line

我正在尝试将命令行输入发送到我的主要功能。然后将输入发送到函数 checkNum 等

int main(int argc, char *argv[])
{

    int x = checkNum(argv[1]);
    int y = checkNum(argv[3]);
    int o = checkOP(argv[2]);
    …
}

它应该是一个计算器所以例如在我写的命令行中:

program.exe 4 + 2

它会给我答案 6(不包括此代码)。

问题是当我想乘法并输入例如

program.exe 3 * 4

它似乎创建了一个指针(或其他东西,不太确定)而不是给我指向 char '*' 的 char 指针。

问题是我能否让输入“*”的行为与我键入“+”时的行为相同?

编辑:在命令行中写入 "*" 有效。有没有办法让我只需要输入 *?

代码在 Windows 上 运行,这似乎是问题的一部分。

正如@JohnBollinger 在评论中所写,您应该使用

/path/to/program 3 '*' 4

目前的写法。

但显然需要一些解释。这是因为 shell 会在将命令行传递给您的程序之前对其进行解析。 * 将扩展到目录中的任何文件 (UNIX) 或类似的东西 (windows),space 分隔。这不是你需要的。你不能在你的程序中修复它,因为为时已晚。 (在 UNIX 上,您可以确保您位于一个空目录中,但这可能无济于事)。

另一种解决方法是引用整个论点(并适当地重写您的程序),即

/path/to/program '3 * 4'

在这种情况下,您将需要使用 strtok_rstrsep 来遍历传递的(单个)参数,将其分隔在 space(s) 上。

shell 如何处理命令行参数超出了程序的范围和控制范围。您无法在程序中放置任何内容来告诉 shell 避免执行其任何正常的命令处理行为。

不过,我建议不要依赖 shell 进行分词,而是让您的程序将整个表达式作为单个参数,并让它解析表达式。这不会让您摆脱引号的需要,但会使生成的命令看起来更自然:

program.exe 3+4
program.exe "3 + 4"
program.exe "4*5"

如果您扩展程序以处理更复杂的表达式,例如包含括号的表达式(这对 shell 也很重要),这也会有所帮助。

如果您不想使用单引号 (') 或双引号 ("),您可以关闭 shell globbing。

# set -o noglob 

# set -f 

(两者等价)。

关闭 shell globbing。现在,shell 不会扩展任何 glob,包括 *.