2014-01-15 64 views
1

我將一個字符傳遞給我的程序,並且我想將此字符存儲到變量中。例如,我運行我的程序像這樣./a.out s file。現在,我要保存的argv [1](其S)給一個變量(可以說,我把它定義這樣char ch;我看到了這種方法:將argv [1]存儲到字符變量

ch = argv[1][0]; 

和它的作品,但我無法理解它。數組argv的心不是一個維數組嗎?如果我刪除[0],我得到一個警告warning: assignment makes integer from pointer without a cast

+1

「的陣列的argv心不是一個維陣列的第一個字符?「 - no:'char * argv []' - 這是一個指向指針的指針(你可以把它看作指向指向」'char指針「數組的第一個元素的指針) – 2014-01-15 12:01:16

+0

In C ,數組和指針之間的差別可能看起來有點模糊,指針總是可以被解釋爲指向數組的第一個元素並且用[]索引,並且argv [1]給出指向char的指針,所以可以將另一個[]添加到使用它作爲char數組(這也是它在這種情況下也是這樣) – hyde

+0

好吧,我明白了,我讀了這個http://crasseux.com/books/ctutorial/argc-and-argv.html,它說'argv是字符串的一維數組',這就是爲什麼我認爲它是一維的。 – yaylitzis

回答

8

如果你看看main()聲明,你看到它的

int main(int argc, const char **argv); 

int main(int argc, const char *argv[]); 

所以argvconst char *(即字符指針或 「C字符串」)的數組。如果取消引用argv[1]你會得到:

"s" 

或:

{ 's' , '\0' } 

,如果你解引用argv[1][0],你會得到:

's' 

作爲一個側面說明,有不需要複製argv[1]中的那個字符,你可以簡單地做:

const char *myarg = NULL; 

int main(int argc, const char **argv) { 
    if (argc != 2) { 
     fprintf(stderr, "usage: myprog myarg\n"); 
     return 1; 
    } else if (strlen(argv[1]) != 1) { 
     fprintf(stderr, "Invalid argument '%s'\n", argv[1]); 
     return 2; 
    } 

    myarg = argv[1]; 

    // Use argument as myarg[0] from now on 

} 
1

argv典型的聲明是

char* argv[] 

這是char*數組。現在char*本身,在這裏,ap ointer到一個以NULL結尾的數組char。因此,argv[1]是類型char*,這是一個數組。因此,您需要[]運算符的另一個應用程序來獲取該數組的一個元素,其類型爲char

3

argv是一串字符串,或者說是一個數組char *。所以argv[1]的類型是char *,而argv[1][0]的類型是char

0

讓我們看看電源簽名:

int main(int argc, char *argv[]) 

否,argv不是一維陣列。它是一個二維字符數組。

  1. argv[1]返回char *之

  2. argv[1][0]返回在argv[1]