C 定义带函数的命令行参数
以下代码:C 定义带函数的命令行参数,c,parsing,command-line-arguments,C,Parsing,Command Line Arguments,以下代码: #include<stdio.h> void main(int argc, char * argv[]) { int i, n, sum = 0; if (argc == 1) { printf("You have forgot to type numbers."); exit(1); } printf("The sum is: "); ///for (i = 1; i < argc; i++)
#include<stdio.h>
void main(int argc, char * argv[]) {
int i, n, sum = 0;
if (argc == 1) {
printf("You have forgot to type numbers.");
exit(1);
}
printf("The sum is: ");
///for (i = 1; i < argc; i++)
///sum = sum + atoi(argv[i]);
for(i = 0; i < argc; i++)
{
n = atoi(argv[i]);
sum += n;
}
printf("%d", sum);
}
#包括
void main(int argc,char*argv[]){
int i,n,和=0;
如果(argc==1){
printf(“您忘记键入数字了。”);
出口(1);
}
printf(“金额为:”);
///对于(i=1;i
在命令行中为我提供总和,因此,例如,如果在提示下键入“program.exe 23 32”,则输出将为“总和为:68”
我想分离求和逻辑,使之成为它自己的函数,然后在提示符处键入“program.exe-sum 23 23 32”以获得相同的结果。我找到了和。后者包含一些有用的代码,几乎完全按照您的要求执行。他们的示例需要知道取了多少个参数(函数sum
中的for循环包含i<5
),但是有一种方法可以解决这个问题
也应该有帮助。在我看来,你并不真的需要
-
在总和前面;第一个参数应为简单字符串:
program.exe sum 1 3 5 9
无论是否保留破折号,都可以简单地安排将指向参数列表其余部分的指针传递给一个函数,该函数期望:
int sum(int numc, char **numv)
它返回在数字向量numv
中表示为字符串的numc
数字的总和。你可以很容易地称之为:
int rv = sum(argc - 2, argv + 2);
在确定要调用的函数是sum
之后。你可以有一个这样的函数集合
如果遇到函数指针,可以创建一个名称数组(用户将在命令行中键入)和函数指针数组(指向相应的函数)。然后,只需查找用户在数组中键入的名称并调用相应的函数。不过,对您来说,这可能还是将来的事情。在许多C代码中,我们采用快捷方式来简化解析。例如,假设我们知道我们只有两种运算符选择:和或积。然后我们知道第一个参数必须是-sum
或-product
。我们可以通过检查-
然后再检查s
或p
来简化解析
至于抽象实际的操作符,在这种情况下,只需检查命令行上选择了哪个操作符,然后基于此应用+=
或*=
,可能更有效
以下是一些工作代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[]) {
int n;
int result;
int i = 1;
char operator;
// parse -sum or -product
if (argv[i] && argv[i][0] == '-') {
// we take a shortcut and just look at the first letter
char firstLetter = argv[i][1];
if (firstLetter == 's') {
// using sum
operator = '+';
result = 0; // additive identity
}
else if (firstLetter == 'p') {
// using product
operator = '*';
result = 1; // multiplicative identity;
}
else {
printf("Unknown option: %s\n", argv[i]);
exit(1);
}
// move on to the next argument
i++;
}
else {
printf("Please specify an operation (-sum or -product)\n");
exit(1);
}
if (!argv[i]) {
printf("You have forgot to type numbers.\n");
exit(1);
}
for(; argv[i]; i++) {
n = atoi(argv[i]);
if (operator == '+') {
result += n;
}
else { // if (operator == '*')
result *= n;
}
}
printf("The result is: %d\n", result);
return 0;
}
#包括
#包括
int main(int argc,char*argv[]){
int n;
int结果;
int i=1;
字符算子;
//解析和或乘积
if(argv[i]&&argv[i][0]='-'){
//我们走捷径,只看第一个字母
char firstLetter=argv[i][1];
如果(第一个字母=='s'){
//使用和
运算符='+';
结果=0;//加法标识
}
else if(firstLetter=='p'){
//使用产品
运算符='*';
结果=1;//乘法恒等式;
}
否则{
printf(“未知选项:%s\n”,argv[i]);
出口(1);
}
//转到下一个论点
i++;
}
否则{
printf(“请指定一个运算(-sum或-product)\n”);
出口(1);
}
如果(!argv[i]){
printf(“您忘记键入数字了。\n”);
出口(1);
}
for(;argv[i];i++){
n=atoi(argv[i]);
if(运算符=='+'){
结果+=n;
}
else{//if(运算符=='*')
结果*=n;
}
}
printf(“结果是:%d\n”,result);
返回0;
}
请注意,result
的初始值因选择的操作而异
上面的代码没有使用argc
,而是利用了argv
数组以null结尾这一事实。换句话说,如果有3个参数(或argc
=4),则argv[3]
将为NULL
(相当于0
或false)
请注意,如果启用了优化,那么任何体面的C编译器都会将测试移到循环之外,因此它实际上只检查选择了一次的操作符。(这很容易通过查看生成的汇编代码进行验证。)main()
返回int
。你的问题是什么?使用像-sum
这样的参数并不意味着它有自己的函数。你只需要解析参数并相应地采取行动。我明白你的意思。我想我在解析部分有点卡住了,也就是我们如何定义参数。第一个是程序名,第二个是函数名,而第三个参数是相应的数据,在本例中是一组要求和的整数。我不认为OP在这里寻找的是va_arg
。使用数组更有意义(特别是因为argv
已经是一个要求和的值数组)。