Linux终端传递*作为计算器参数时被解析为文件名的解决方法
解决命令行中
*被Shell解析为文件名的问题 问题说明
你编写的简易计算器代码如下:
op函数
int op(char* sig, int num1, int num2) { char sign=*sig; if(sign == '+') return num1+num2; if(sign == '/') return num1/num2; if(sign == '-') return num1-num2; if(sign == '*') return num1*num2; return 0; }
主函数
int main(int argc, char *argv[]) { int num1=atoi(argv[1]); int num2=atoi(argv[3]); char* sig=argv[2]; int res=op(sig,num1,num2); printf("%d\n",res); }
运行时,输入./pw.exe 3 + 4能正常输出7,但输入./pw.exe 3 * 4仅输出0。这是因为*是Shell的通配符,会被自动解析为当前目录下的所有文件名,导致程序接收到的argv[2]不是*字符,而是某个文件名,最终op函数匹配不到运算符,返回0。
解决方法
有三种常用方式可以让*作为普通字符传递给程序:
单引号包裹:在终端输入时用单引号将
*括起来,命令为:./pw.exe 3 '*' 4单引号会完全阻止Shell对内部字符的解析,确保
*原封不动传递给程序。双引号包裹:使用双引号包裹
*,命令为:./pw.exe 3 "*" 4双引号下大部分特殊字符不会被解析,
*也包含在内,同样能达到效果。反斜杠转义:在
*前添加反斜杠进行转义,命令为:./pw.exe 3 \* 4反斜杠会告诉Shell后续字符为普通字符,无需执行通配符展开。
补充说明
这本质是Shell的通配符展开机制导致的问题,并非代码存在错误。Shell会在执行程序前,先对命令行中的通配符进行展开,再将展开后的参数传递给程序。上述方法都是通过阻止Shell的通配符展开,让*直接作为参数传递给计算器程序。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

