2012-11-03 47 views
0

首先,我不得不说我是C编程新手。我想要做的是编写一个程序,它接受一个参数输入并将其转换为一个整数,然后返回它的值。我的代码如下所示: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 
+3

作为一个旁注,我只是不禁想知道为什么你试图首先获取参数的值,但只有然后检查它是否实际上已经被赋予 - 否(用'argc!= 2') – raina77ow

+0

As它似乎是今天丑陋的铸造:'int fromArgv =(int)NULL;'会工作。 – alk

+0

@alk为什么它不能写成像'int fromArgv = atoi(argv [1])',我想知道。 – raina77ow

回答

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]存在,你访问它,所以你没有得到段错误如果之前用户不输入任何命令行参数。在分配fromArgv之前,您应该移动if (argc != 2)测试。

+0

'atoi()'不喜欢'NULL'。 – alk

+0

非常感谢您向我解释这一点。现在我明白了,它也有效。 –

3

NULL是空指针不变,并试图将其分配给整数值(fromArgv),因此您的编译器会报告警告。

下面的初始化工作正常:

fromArgv = 0; 

虽然,它是无用的,因为你的下一行修改您的变量的值:

int fromArgv = atoi(argv[1]); 

顺便说一句,这是从main返回这种类型的值(它经常保留给错误代码)是一个糟糕的主意,并且你太迟的参数数目。

0

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

0

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

只是

int fromArgv = atoi(arg[1]); 

应该是工作的罚款

1

正如其他人提及的,要初始化一个“空指针”的整数(即从一个类型的点是一个指针),其是错的。你想把它初始化为零,

 int fromArgv = 0; 

然后,你应该选择的参数,将其转换为而不是int检查参数的数目了。所以,你应该在if (argc != 2)部分之后移动“atoi”线。

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