我试图从命令行向我的main函数发送输入。然后将输入发送到函数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' *
'的
问题是我可以获得输入' *
'表现方式与我输入' +'?时的行为相同
编辑:在命令行中编写"*"
有效。有没有办法我只需要输入*
?
代码在Windows上运行,这似乎是问题的一部分。
答案 0 :(得分:7)
@JohnBollinger在评论中写道,你应该使用
/path/to/program 3 '*' 4
目前的写作方式。
但显然需要一些解释。这是因为shell会在将命令行传递给程序之前对其进行解析。 *
将扩展到目录中的任何文件(UNIX)或类似的(windows),空格分隔。这不是你需要的。你无法在你的程序中修复它,因为它为时已晚。 (在UNIX上,您可以确保您在一个空目录中,但这可能没有帮助。)
另一种方法是引用整个论点(并适当地重写你的程序),即
/path/to/program '3 * 4'
在这种情况下,您需要使用strtok_r
或strsep
来逐步执行传递的(单个)参数,将其分隔在空格上。
答案 1 :(得分:6)
shell如何处理命令行参数超出了程序的范围和控制范围。程序中没有任何东西可以告诉shell避免执行任何正常的命令处理行为。
但是,我建议,不要依赖shell进行单词拆分,而是让程序期望整个表达式作为单个参数,并使其解析表达式。这不会减轻您对引号的需求,但它会使得结果命令看起来更自然:program.exe 3+4
program.exe "3 + 4"
program.exe "4*5"
如果您扩展程序以处理更复杂的表达式,例如包含括号的表达式(对shell也很重要),这也会有所帮助。
答案 2 :(得分:2)
如果您不想使用单引号('
)或双引号("
),则可以关闭shell通配。
待办事项
# set -o noglob
或
# set -f
(两者都相同)。
关闭shell globbing。现在,shell不会扩展任何内容,包括*
。