2011-11-01 117 views
0

我一直在尋找解決方案,但還沒有找到一個。數組指針函數

我有哪個做一些字符串操作(簡體)的函數:

void plr(char str, char *stro){ 
    strcpy(*stro, str); 
} 

我的問題就在於,我無法從功能出來讓我的結果:

int main(void){ 
    //string and string out. 
    char str[25], stro[25]; 
    printf("Something please: "); 
    scanf("%s", &str); 

    plr(str, &stro); // So basically stro would be the same as str. 
    printf("Copy succesfull, %s", stro); 
    return 0; 
} 

整個想法是,我有函數pluralis,它將賦予給定的字符串多個,並將其輸出到stro。整個字符串操作已經過測試並且可以工作,如果它在main()中,但是我根本無法使它與函數和指針一起工作。我顯然可以放棄,但我會從中學到什麼。

有什麼我需要考慮的時候,它是我指向的數組,而不是一個正常的排序值。

編輯:感謝所有的幫助,它已被解決。非常感謝所有!

+2

STR必須是指針,所以首先,你PRL功能應該是'無效PRL(爲const char *海峽,字符* STRO)',由於str是源,它應該通過const。 – Aif

回答

0

無需亂用指針這種方式;)

[email protected]:~$ cat prova.c 
#include <stdio.h> 
#include <string.h> 

void foo(char *strin, char *strout) 
{ 
    strcpy(strout, strin); 
} 

int main(void) 
{ 
    char a[100], b[100]; 

    printf("What's a? "); 
    scanf("%s", a); 

    printf("What's b? "); 
    scanf("%s", b); 

    foo(a, b); 

    printf("a is \"%s\"\nb is \"%s\"\n", a, b); 
} 
[email protected]:~$ gcc prova.c 
[email protected]:~$ ./a.out 
What's a? abc 
What's b? def 
a is "abc" 
b is "abc" 
[email protected]:~$ 

釋:
這工作,因爲當你使用一個數組的名字它衰減到它的第一個元素的指針。所以foo(a, b)實際上是foo(&a[0], &b[0])。因此,即使ab是數組,將它們傳遞給函數將它們「轉換」爲指針。
here報價:

當你傳遞一個數組作爲參數傳遞給函數,你真傳 的指針數組的第一個元素,因爲數組衰減到 指針。

和,下面幾行:

衰變是一個隱式&; array == & array == & array [0]。在英語中, 這些表達式讀「陣列」,「指針數組」,而「指針 陣列的第一個元素」(下標操作符,[],具有比所述地址的操作者更高的優先級 )。但在C中,所有三個表達式都表示同樣的意思。

結論是,代碼中的問題只是plr的原型。

查找數組指向衰減以獲取有關此現象的更多信息。 :)

+0

這很好,但是,我不明白你爲什麼突然不需要在前面的&符號輸出,就像你通常會這樣(至少這是我教過的)。如果你能詳細說明,將不勝感激。 – Dennis

+0

@Kola:他不需要'&'因爲他沒有修改指針,只需要指針的副本。相反,他正在修改指針指向的內容。 –

+0

編輯你的答案,使其可讀,然後讓人們閱讀它。 – littleadv

0

也許你需要一個指針的指針,也就是聲明你的函數void plr(char str, char **stro)

0

我相信,你的代碼更改爲:

void plr(char* str, char *stro) 

你想在一個數組str中傳遞,你必須使用char * str指針。我不認爲你可以直接將數組傳遞給函數。

如果你聲明char str [25];編譯器爲數組保留內存,如果使用char *,它將指向數組中的第一個元素。

我希望這個作品!

GR,

迪特

+0

您可以將數組「直接」傳遞給函數,但它們仍然按照引用傳遞。 –

+0

我說得不清楚,對不起。我曾經嘗試過使用類似void plr(char str [],char stro [])的東西;這是沒有工作^^這就是我正在試圖說'直接傳遞他們':) –

2

你應該這樣做:

void plr(char str[], char stro[]) 
{ 
    strcpy(stro, str); 
} 

int main(void) 
{ 
    char str[25], stro[25]; 
    printf("Something please: "); 
    scanf("%s", &str); //unsafe code 

    plr(str, stro); 
    printf("Copy succesfull, %s", stro); 
    return 0; 
} 

使用指針數組或更多的字符串時,請非常小心:

  1. http://pw1.netcom.com/~tjensen/ptr/pointers.htm

使用scanf函數從用戶那裏得到的字符串是真的更多的是壞事:

  1. Disadvantages of scanf