You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:05:10