C参数转换

时间:2012-11-03 17:47:03

标签: 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]);    /* 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;
}

尝试编译时出现以下错误:

ex1.c: In function ‘main’:
ex1.c:6:18: error: initialization makes integer from pointer without a cast [-Werror]
cc1: all warnings being treated as errors

5 个答案:

答案 0 :(得分:5)

你的问题就在这一行

int fromArgv = NULL; 

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

但是,在这种情况下,无需初始化fromArgv。你可以这样做:

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],这样如果用户没有输入任何命令行参数,就不会出现段错误。您应该在分配if (argc != 2)之前移动fromArgv测试。

答案 1 :(得分:3)

NULL是一个空指针常量,并且您尝试将其分配给整数值(fromArgv),因此您的编译器报告警告。

以下初始化工作正常:

fromArgv = 0;

虽然它没用,但是你要在下一行修改变量的值:

int fromArgv = atoi(argv[1]);

顺便说一句,从main返回这种值是一个坏主意(它通常被保留给错误代码),而且你过早地支持参数的数量。

答案 2 :(得分:1)

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

       int fromArgv = 0;

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

还要考虑使用strtol代替atoi的可能性。前者允许您检查转换是否成功。

答案 3 :(得分:0)

你不能将fromgv初始化为NULL,因为NULL是一个指针,你将它分配给int 只需将行更改为fromArgv;

答案 4 :(得分:0)

为什么你必须从Argv初始化?

int fromArgv = atoi(arg[1]);

应该工作正常