C参数转换

C参数转换,c,arguments,C,Arguments,首先,我必须说我对C语言编程是新手。我要做的是编写一个程序,它接受一个参数输入并将其转换为整数,然后返回其值。我的代码如下所示: #include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { int fromArgv = NULL; /* holds value from argv[1] */ fromArgv = atoi (argv[1]); /* conve

首先,我必须说我对C语言编程是新手。我要做的是编写一个程序,它接受一个参数输入并将其转换为整数,然后返回其值。我的代码如下所示:

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

int main (int argc, char *argv[])
{
   int fromArgv = NULL;  /* holds value from argv[1] */
   fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

   /* if incorrect no. of arguments entered */
   if (argc != 2) {
   fprintf (stderr, "error: wrong number of arguments\n");
   exit (EXIT_FAILURE);
   } 

   return fromArgv;
}

NULL
是一个空指针常量,您试图将其赋给整数值(
fromArgv
),因此编译器会报告一个警告

以下初始化工作正常:

fromArgv = 0;
尽管如此,它是无用的,因为您正在下一行修改变量的值:

int fromArgv = atoi(argv[1]);

顺便说一句,从
main
返回此类值是个坏主意(它通常保留给错误代码),而且您检查参数的数量太晚了。

您的问题是行

int fromArgv = NULL; 
我相信
NULL
通常被定义为
(void*)0
,这是一个指针。您正在将此指针指定给一个
int
变量,该变量会给出错误信息

但是,在这种情况下,不需要从argv初始化
。您只需执行以下操作:

int fromArgv;  /* holds value from argv[1] */
fromArgv = atoi (argv[1]);    /* convert argv[1] to int */
甚至只是

int fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

但是,您需要做的是确保在访问它之前存在
argv[1]
,这样,如果用户没有输入任何命令行参数,您就不会得到segfault。如果(argc!=2)
测试在
从argv
赋值之前,您应该将
测试从argv移动到NULL,因为NULL是指针,而您正在将它赋值给int

只需将行从argv更改为int

为什么必须从argv初始化

只是


应该可以正常工作

正如其他人提到的,您正在使用“空指针”(从类型的角度来看是指针)初始化一个整数,这是错误的。你想把它初始化为零

       int fromArgv = 0;
然后,您应该选择参数并在之后而不是在检查参数数量之前将其转换为int。因此,您应该将“atoi”行移动到
if(argc!=2)
部分之后


还可以考虑使用
strtol
而不是
atoi
。前者允许您检查转换是否成功。

作为旁注,我不禁想知道,为什么您要先尝试获取参数的值,然后才检查它是否真的被给定了(使用
argc!=2
),就像今天的难看转换一样:
int fromArgv=(int)NULL
会起作用。@alk为什么它不能像
int fromArgv=atoi(argv[1])
那样编写呢?我想知道.int不能包含NULL(不是指针),当程序没有失败时,返回0以外的值不是一个好主意,最好打印f(“%d\n”,fromArgv)OT:除非您确定不向它传递任何东西,否则不要使用
atoi()
,计算结果为
0
,因为
0
也会在出错时返回。改为使用
strtol()
atoi()
不喜欢
NULL
。非常感谢您向我解释这一点。现在我明白了,它也起作用了。
int fromArgv = atoi(arg[1]);
       int fromArgv = 0;