为什么我不能做int x = argv [1];

时间:2018-06-24 11:05:12

标签: c

我是C的新手,有以下问题。

为什么我不能只使用: int x = argv [1];

我必须使用“ atoi ”来使代码正常工作。 int x = atoi(argv [1]);

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

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        printf("Nope\n");
        return 1;
    }

    int x = atoi(argv[1]);
    int years = x/365;
    int weeks = (x % 365)/7;
    int days = x - ((years * 365) + (weeks * 7));

    printf("Years: %d\n", years);
    printf("Weeks: %d\n", weeks);
    printf("Days: %d\n", days);

}

2 个答案:

答案 0 :(得分:1)

您已经拥有的代码,

int x = atoi(argv[1]);

(几乎)是完全正确的方法。

您为什么必须这样做?由于argv strings 的数组,因此没有从字符串到整数的自动转换。您必须明确进行转换,而atoi是完成转换的一种方式。

当您可能想要main时,为什么将int定义为接受字符串数组?因为main只能有一个定义,所以它必须是通用的。从这个意义上说,字符串是通用的。字符串可以表示整数,浮点数,单个字符或字符串-您只需要根据程序为其参数分配的含义提供适当的(显式的)转换即可。

不过,还有另一件事要担心。您的程序希望其第一个参数为整数,但是如果用户键入的不是整数,该怎么办?如果用户键入“ 123x”或“ abc”怎么办?在第一种情况下,atoi会将其转换为123,并悄悄丢弃x。在第二种情况下,atoi将安静地返回0,完全不执行整数转换。毕竟,如果要检测这些错误,则不能使用atoi;您必须做一些更复杂的事情。通常的建议是改用strtol,尽管最终要正确区分可能遇到的所有不同情况至少有些棘手。 (有关指导,请参见this question上的答案。)

答案 1 :(得分:1)

你不能这样使用

int x = argv[1]; /* its wrong as x can hold integer value but argv[1] which is char array */

因为argv[1]char*类型,而xint类型,即两个操作数类型都不同。

如果您想使之成为可能,则需要通过在其上调用argv[1]int的结果转换为atoi()类型。例如

int x = atoi(argv[1]); /* atoi() returns int and that you are assigning to x(int type) which is correct */ 

编辑:-库函数atoi()可以很好地工作,直到用户给定的输入可以用integer表示并且转换后的值可以适合int范围。否则atoi()不支持处理这些错误,因为它不会将errno设置为失败。就像用户输入argv[1]作为123abcd一样,则atoi()的结果是未定义的行为。我认为strtol()是更好的选择。