2012-07-30 120 views
7

任何人都可以向我解釋我不明白的地方嗎?傳遞char數組作爲參數

我想將參數作爲「字符串」傳遞(我知道c中沒有字符串),以便以後可以使用該字符串與其他函數一樣,例如它必須作爲文件名傳遞。 但我不知道爲什麼它不會接受它或者它應該是什麼類型的

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    char *array= argv[0]; 
    foo(*array); 
} 

void foo(char *array) 
// notice the return type - it's a pointer 
{ 
    printf(array); 
} 

非常感謝!

+0

取消引用數組,而傳遞給foo。所以如果它是一個c字符串文字,你只能傳遞第一個字節值 – Lefteris 2012-07-30 01:41:54

+0

你應該避免像'printf(s)'這樣的表達式,因爲它是一個不受控制的格式字符串。 – md5 2012-07-30 06:09:01

回答

17

你應該調用該函數是這樣的:

foo(array); 

你在做什麼時取消引用指針,它返回一個char,這是字符串中的第一個字符。

printf調用也應該是這樣的:

printf("%s", array); 

你的整個固定的代碼應該如下所示:

#include <stdio.h> 

void foo(char *array) 
{ 
    printf("%s", array); 
} 

int main (int argc, char *argv[]) 
{ 
    // TODO: make sure argv[1] exists 
    char *array= argv[1]; 
    foo(array); 
} 
+0

我像你說的那樣去除了星號,它仍然不起作用! 它說:重新定義:不同的基本類型 – Ryan 2012-07-30 01:45:50

+0

是的,這是一個全新的問題;錯誤地使用'printf'。 – chris 2012-07-30 01:48:30

+0

我做了兩個修復,仍然說同樣的事情,不會編譯! – Ryan 2012-07-30 01:49:29

5

當你說foo (*array),你腐爛的陣列成指向第一個元素的指針,以便取消引用該元素,爲您提供第一個字符。這就是你想要傳遞給函數的東西。不要留下星號,只要通過array就可以衰減成你需要的指針。

另一個問題是您沒有正確使用printf。首先,這是一個reference。你需要傳遞一串令牌,告訴編譯器接下來要做什麼類型的參數,因爲它沒有辦法告訴。在你的情況下,你的字符串將包含"%s"告訴它期望char *,然後你會通過array作爲char *參數。

printf ("The string is %s", array); 
+0

我像你說的刪除了asterix,它仍然不起作用!它說:重新定義:不同的基本類型 – Ryan 2012-07-30 01:46:38

+0

我注意到你重新調整到了以前的狀態嗎?在傳遞給函數的參數中是否會有一個星號?其實我只是注意到有或沒有它,它不會工作 – Ryan 2012-07-30 01:51:56

+0

@Ryan,你不應該在任何地方解引用腐朽的數組。當它傳遞給一個函數時,它已經腐蝕成你需要的指針。 – chris 2012-07-30 01:52:38

1

argv是字符指針的數組,即意味着argv將要存儲哪個你作爲命令行參數傳遞的所有字符串的地址。

so argv[0]將給出您作爲命令行參數傳遞的第一個字符串的地址,即存儲在main函數中的指針變量array中的地址。

現在,您只需將地址傳遞給函數foo,但您傳遞的是該字符串的第一個字符。例如,如果您的第一個命令行參數是temp.txt,則您將字符t傳遞給函數foo。因此,在foo函數中,您正在使用字符指針變量array,因爲將分配字符t的ASCII值。然後你將它傳遞給printf,它會將該ASCII值作爲地址,並嘗試訪問該地址以進行打印,從而導致崩潰(意外行爲)。

因此,您必須僅將命令行參數的地址傳遞給函數foo(如下所示)。

foo(array);

printf(array) - 這裏printf將踏格式說明作爲字符串(%s),它會嘗試打印從地址array,直到它遇到一個空字符\0開始的所有字符。

不過還好添加printf像下面

printf("%s", array);

+0

優秀的解釋!謝謝! – Ryan 2012-07-30 22:43:03