尝试从命令行获取星号 * 作为对 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_r
或 strsep
来遍历传递的(单个)参数,将其分隔在 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,包括 *
.
我正在尝试将命令行输入发送到我的主要功能。然后将输入发送到函数 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_r
或 strsep
来遍历传递的(单个)参数,将其分隔在 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,包括 *
.