2012-11-03 37 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的可能性。前者允許您檢查轉換是否成功。