linux 如何在命令行中向函数传递int和char变量

xcitsw88  于 2022-11-02  发布在  Linux
关注(0)|答案(2)|浏览(120)

我写了一个函数,其中传递了两个整数和一个运算符字符(+-*/)并给予两个数字的结果。代码获取字符并使用其ascii值对其进行检查。如果我传递一个数字来代替运算符(42代替 *)则它工作,但我不知道如何将其作为char进行传递,因为该函数具有int argc和int * argv参数(函数原型是由一位教师编写的。)如何使它能够直接从命令行传递char?


# include <stdio.h>

# include <stdlib.h>

# include <unistd.h>

int result;

int main(int argc, char *argv[]){
    printf("main_add pid: %d\n", getpid());
    int a = 0;
    int b = 0;
    char c;
    //printf("%s\n", argv[1]);
    //printf("%s\n", argv[2]);
    //printf("%s\n", argv[3]);
    a = atoi(argv[1]);
    b = atoi(argv[2]);
        c = atoi(argv[3]);

    if (c=='*'){
    result = a * b;

    printf("%d * %d = %d\n", a, b, result);
    }
    else if(c=='+'){
    result = a + b;

    printf("%d + %d = %d\n", a, b, result);
    }
    else if(c=='-'){
    result = a - b;

    printf("%d - %d = %d\n", a, b, result);
    }
    else if(c=='/'){
    result = a / b;

    printf("%d / %d = %d\n", a, b, result);
    }
    else{
    printf("fail");
    }
}
```[enter image description here][2]

  [1]: https://i.stack.imgur.com/X0eiN.png
  [2]: https://i.stack.imgur.com/ij5FR.png
yiytaume

yiytaume1#

该函数具有int argc和int * argv参数(函数原型是由教师编写的)。
这 * 不是 * 由教师编写的,从某种意义上说,这是 * 您的 * 教师之一设计的。int main(int argc, char *argv[])是C程序入口点签名的仅有的两个标准变体之一,也是其中唯一一个提供处理命令行参数的变体。
我如何使它可以直接从命令行传递char?
你的程序 * 已经 * 从命令行以C字符串的形式接收字符数据了。不然你认为为什么要通过atoi() * 将这些字符串 * 转换 * 成数字呢?
但是,你认为将atoi()应用于一个你不希望具有数字字符串形式的参数有什么作用呢?这正是产生...
如果我传递一个数字来代替运算符(42代替 *),那么它就可以工作
......这不是你想要的。
argv数组包含指向字符串的指针,可以从这些字符串中读取命令行参数的字符。如果要读取参数的字符,请直接执行此操作。例如,

c = argv[3][0];

然而,你最好先检查argv的值,确认至少传递了3个参数,因为argv还提供了程序名,这意味着你要寻找的argv至少是4。

r6vfmomb

r6vfmomb2#

C标准只为main函数定义了两个有效的声明。它们是int main(void),用于不接受命令行输入的程序,int main(int args, char *argv[])用于接受命令行输入的程序。
在第二种情况下,int args将表示C字符串数组char *argv[]中的元素数,该数组是指向每个参数的C字符串表示的指针数组。至于 * 如何直接从命令行向程序传递字符 * 问题,您必须使用字符串表示,但这并不重要。
假设您编译了这个程序并将其命名为“calculator.elf”
如果要运行:./calculator.elf 2 7 *
main函数将通过传递一个值为4的args和一个带有四个指向C字符串的指针的argv[]来获知这些参数。第一个是"./calculator.elf",第二个是"2",第三个是"7",第四个是"*"
你在索引1、2和3中寻找你的参数是正确的,因为你不需要你的程序名作为参数,atoi("2")atoi("7")应该分别给予你2和7,但是atoi("*")不会给你一个有用的结果,因为"*"不是一个数字字符串。
请记住,"*"是一个字符串,而不是单个字符,因此argv[3]将是指向'*'字符的指针,该字符后面紧跟着'\0'字符。
用于确定是否在argv[3]中传递了"*"的有效检查是strcmp(argv[3],"*") == 0argv[3][0] == '*' && argv[3][1] == '\0',但是,如果传递了指向非数字字符串的指针,则根据atoi的C规范,atoi(argv[3])应返回0

相关问题