我是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);
}
答案 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*
类型,而x
是int
类型,即两个操作数类型都不同。
如果您想使之成为可能,则需要通过在其上调用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()
是更好的选择。