如何从 C 命令行读取星号 ( * ) 作为参数
How to read asterisk( * ) as an argument from the command line in C
我编写了一个代码来执行从命令行获取输入的简单算术运算。所以如果我想做乘法,我会在终端中输入 "prog_name 2 * 3",它应该输出 "Product : 6"。
问题是,除乘法外,所有运算都有效。经过一些测试,我发现用于获取运算符的第三个参数(argc[2])实际上存储的是程序名称。那么我怎样才能使这项工作呢?
这是代码:
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
int a, b;
if(argc != 4)
{
printf("Invalid arguments!");
system("pause");
exit(0);
}
a = atoi(argv[1]);
b = atoi(argv[3]);
switch(*argv[2])
{
case '+':
printf("\n Sum : %d", a+b);
break;
case '-':
printf("\n Difference : %d", a-b);
break;
case '*':
printf("\n Product : %d", a*b);
break;
case '/':
printf("\n Quotient : %d", a/b);
break;
case '%':
printf("\n Remainder: %d", a%b);
break;
default:
printf("\n Invalid operator!");
}
}
这与 C 无关,与您的 shell 无关。如果您希望能够将它们作为参数,则需要引用 *
(和其他 shell 特殊字符)。否则 shell 将进行替换,特别是通配。
所以你需要调用你的程序:
./myprog 3 '*' 2
实际上,它是 OS 负责扩展通配符的那个,所以它是 OS 特定的(C 程序接收的正是 OS 所解释的) .
也就是说,在大多数 OS 中,如果您引用通配符,它不会被扩展 program_name 2 "*" 3
。更好的是,将整个表达式作为单个参数传递 (program_name "2 * 3"
)
您的问题不在您的代码中。它在 OS/shell 中。你看,命令行中的 *
扩展为目录内容,因此参数 2 * 3
扩展为 2 dir1 dir2 file1, file2, etc...
我建议你使用像“2*3”这样的参数和像 sscanf(argv[1], "%d%c%d", &a, &command, &b);
这样的参数
我编写了一个代码来执行从命令行获取输入的简单算术运算。所以如果我想做乘法,我会在终端中输入 "prog_name 2 * 3",它应该输出 "Product : 6"。
问题是,除乘法外,所有运算都有效。经过一些测试,我发现用于获取运算符的第三个参数(argc[2])实际上存储的是程序名称。那么我怎样才能使这项工作呢?
这是代码:
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
int a, b;
if(argc != 4)
{
printf("Invalid arguments!");
system("pause");
exit(0);
}
a = atoi(argv[1]);
b = atoi(argv[3]);
switch(*argv[2])
{
case '+':
printf("\n Sum : %d", a+b);
break;
case '-':
printf("\n Difference : %d", a-b);
break;
case '*':
printf("\n Product : %d", a*b);
break;
case '/':
printf("\n Quotient : %d", a/b);
break;
case '%':
printf("\n Remainder: %d", a%b);
break;
default:
printf("\n Invalid operator!");
}
}
这与 C 无关,与您的 shell 无关。如果您希望能够将它们作为参数,则需要引用 *
(和其他 shell 特殊字符)。否则 shell 将进行替换,特别是通配。
所以你需要调用你的程序:
./myprog 3 '*' 2
实际上,它是 OS 负责扩展通配符的那个,所以它是 OS 特定的(C 程序接收的正是 OS 所解释的) .
也就是说,在大多数 OS 中,如果您引用通配符,它不会被扩展 program_name 2 "*" 3
。更好的是,将整个表达式作为单个参数传递 (program_name "2 * 3"
)
您的问题不在您的代码中。它在 OS/shell 中。你看,命令行中的 *
扩展为目录内容,因此参数 2 * 3
扩展为 2 dir1 dir2 file1, file2, etc...
我建议你使用像“2*3”这样的参数和像 sscanf(argv[1], "%d%c%d", &a, &command, &b);