我写了一个函数,其中传递了两个整数和一个运算符字符(+-*/)并给予两个数字的结果。代码获取字符并使用其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
2条答案
按热度按时间yiytaume1#
该函数具有int argc和int * argv参数(函数原型是由教师编写的)。
这 * 不是 * 由教师编写的,从某种意义上说,这是 * 您的 * 教师之一设计的。
int main(int argc, char *argv[])
是C程序入口点签名的仅有的两个标准变体之一,也是其中唯一一个提供处理命令行参数的变体。我如何使它可以直接从命令行传递char?
你的程序 * 已经 * 从命令行以C字符串的形式接收字符数据了。不然你认为为什么要通过
atoi()
* 将这些字符串 * 转换 * 成数字呢?但是,你认为将
atoi()
应用于一个你不希望具有数字字符串形式的参数有什么作用呢?这正是产生...如果我传递一个数字来代替运算符(42代替 *),那么它就可以工作
......这不是你想要的。
argv
数组包含指向字符串的指针,可以从这些字符串中读取命令行参数的字符。如果要读取参数的字符,请直接执行此操作。例如,然而,你最好先检查
argv
的值,确认至少传递了3个参数,因为argv
还提供了程序名,这意味着你要寻找的argv
至少是4。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],"*") == 0
或argv[3][0] == '*' && argv[3][1] == '\0'
,但是,如果传递了指向非数字字符串的指针,则根据atoi
的C规范,atoi(argv[3])
应返回0