Linux下C语言 命令行参数 输入 ‘*’ 引起的错误——c语言计算器程序

今天做实验楼的C计算器小程序实验,把scanf输入改编成通过argv输入参数。

+,-,/三种运算都可以。

代码如下

#include<stdlib.h>

int main(int argc,char* argv[])
{
    double num1 = 0.0 ,num2 = 0.0;
    double num = 0.0;
    char op = '+';
    printf("%s\n",argv[0]);
    printf("%s\n",argv[1]);
    printf("%s\n",argv[2]);
    printf("%s\n",argv[3]);
    if(argc < 4)
    {
        printf("error,input isn't enough.\n");
        exit(1);
    }
    num1    = atof(argv[1]);
    op      = argv[2][0];
    num2    = atof(argv[3]);
    switch(op)
    {
        case '+':
            num = num1 + num2;
            break;
        case '-':
            num = num1 - num2;
            break;
        case '*':
            num = num1 * num2;
            break;
        case '/':
            if(num2 == 0.0)
            {
                printf("error,num2 = 0.\n");
                exit(1);
            }
            num = num1 / num2;
            break;
        default:
            printf("error,op wrong.\n");
            exit(1);
    }
    printf("num = %lf\n",num);
    return 0;
}

输入其他的参数如“1 + 2”,“4 / 0”等都有相应的结果,然后输入带“4 * 46”等带星号的结果会出现op操作符错误。

Linux下C语言 命令行参数 输入 ‘*’ 引起的错误——c语言计算器程序

打断点测试,op获取的argv[2]的首字符是a。

起初我以为是ascii码的问题,经排查无误,然后我写了几行,显示argv所有参数的字符串,这才发现了问题。

Linux下C语言 命令行参数 输入 ‘*’ 引起的错误——c语言计算器程序

argv[2]的参数竟然是anaconda3这种莫名其妙的字符串,原来是linux下*被当作通配符,匹配到了文件夹内的字典排序的第一个文件名。通过\*就可以正常显示了。

实际生产时总会出现各种各样理论中不会出现的问题,还需多多努力。