在C中获取命令行参数?

时间:2016-03-18 14:28:12

标签: c command-line

所以我对C很新,我正在尝试学习如何使命令行输入,我输入的是我希望是正确的语法,我试图得到它,所以你输入2个数字,它返回两个加在一起的数字。该程序确实编译,但是当我尝试运行它时,它需要参数并且它们的打印完全错误,几乎就像打印内存地址一样。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int addition(int a, int b);

int main(int argc, char *argv[]) {
    if(argc != 3) {
        printf("You must enter 2 numbers!");
        return TRUE;
    }
    else {
        int answer = addition((int)*(argv[0]), (int)*(argv[1]));
        printf("%d + %d = %d", argv[0], argv[1], answer);
        return FALSE;
    }
}

int addition(int a, int b) {
    return a + b;
}

那么我做错了什么?我输入2 3时的输出是:

155 + 50 = 165

4 个答案:

答案 0 :(得分:2)

通过**argv传递给您的值不是整数,它们是以空字符结尾的字节字符串。为了执行添加,您首先需要使用atoi()之类的东西将它们转换为整数。否则,您将在字符数组上执行数字加法。

答案 1 :(得分:2)

替换这些行:

int answer = addition((int)*(argv[0]), (int)*(argv[1]));
printf("%d + %d = %d", argv[0], argv[1], answer);

使用:

int answer = addition(atoi(argv[1]), atoi(argv[2]));
printf("%d + %d = %d", atoi(argv[1]), atoi(argv[2]), answer);

正如David Hoelzer在另一个回答中所说,参数包含空终止字节字符串。使用atoi()会将字符串转换为整数。

使用argv[1]argv[2]代替,因为它们实际上是包含您输入的值的那些。根据ISO C标准规范:

  

如果argc的值大于零,则argv [0]指向的字符串表示程序名称;如果程序名不能从主机环境获得,则argv [0] [0]应为空字符。

argv[0]将包含该程序的名称。

有关argv[0]作为该计划名称的更多信息,请参阅this StackOverflow answer

关于代码,您总是可以将参数存储在如下变量中:

int a = atoi(argv[1]);
int b = atoi(argv[2]);

然后将它们传递到addition()函数并在printf()部分中使用它。

答案 2 :(得分:1)

int answer = addition((int)*(argv[0]), (int)*(argv[1]));
printf("%d + %d = %d", argv[0], argv[1], answer);

我担心这不会像你期望的那样奏效。 argv[x]是指向字符的指针,而不是整数。例如,如果您输入“2 3”,argv[0]指向表示正在运行的程序名称的字符串(如果名称不可用,则为空指针),argv[1]指向“ 2“,argv[2]指向”3“,argv[argc](即argv[3])指向空指针。

要转换一个字符串,它本质上是一个const char数组,只是转换不起作用。您可以改为调用atoi()功能。这是有效的代码(没有错误处理):

#include <stdio.h>
#include <stdlib.h>

int addition(int a, int b);

int main(int argc, char *argv[]) {
    if(argc != 3) {
        printf("You must enter 2 numbers!");
        return EXIT_FAILURE;
    }
    else {
        int a = atoi(argv[1]), b = atoi(argv[2]);
        int answer = addition(a, b);
        printf("%d + %d = %d", a, b, answer);
        return EXIT_SUCCESS;
    }
}

int addition(int a, int b) {
    return a + b;
}

输入“2 3”时,输出为“2 + 3 = 5”。

有些不敬:为什么在返回时使用TRUEFALSE?为避免幻数,您可以使用EXIT_SUCCESSEXIT_FAILURE

答案 3 :(得分:1)

首先,您的输入参数从npm rebuild node-sass开始; argv[1]始终是您用于调用程序的字符串。

其次argv[0]不会将(int)*(argv[1])从字符串转换为整数;它的作用是将argv[1]中第一个字符的字符代码从argv[1]转换为char。假设ASCII,如果argv [1]是int,则该行将字符值 "10"(ASCII 49)从类型'1'转换为类型{{ 1}}。

您需要使用像charint这样的库函数将参数从字符串转换为整数,如下所示:

atoi

阅读strtol man page以获取参数说明。