2015-12-21 102 views
3

我想將初始化的字符指針數組傳遞給函數。我似乎無法弄清楚爲什麼函數只打印出數組中每個元素的數字。將字符指針數組傳遞到函數

有誰知道我怎麼能打印每個字符串元素從傳入的指針數組?如果你要打印的數組的內容

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 

void sort(char *); 

int main() 
{ 
    char *states[4] = {"Florida", "Oregon", "California", "Georgia"}; 

    sort(*states); 

    return 0; 
} 

void sort(char *states) 
{ 
    int x; 

    for (x = 0; x < 4; x++) { 
     printf("\nState: %d\n", states[x]); //only this will compile 
     //printf("\nState: %s\n", states[x]); //need to print this. 
    } 

} 
+0

您將一個指向佛羅里達的指針傳遞給該函數,然後打印出對應於該字符串前四個字母的數字。那不是你想要的嗎? –

+2

'sort(states);'和'void sort(char * states [])' – Rabbid76

+0

好的,我明白了。所以我不接受指針數組。 – Andrew

回答

5

sort函數必須接受指針數組。

void sort (char *states[], size_t num_states) { 
    int x; 

    for (x = 0; x < num_states; ++x) { 
     printf("\nState: %s\n", states[x]); /* Note %s instead of %d */ 
    } 
} 

而且,您必須將數組傳遞給函數。

sort(states, 4); 
+0

好的,我明白了。所以我不接受指針數組。 – Andrew

+1

'sort'函數必須接受指向指針的指針。最終,'char * states []'等同於'char ** states'作爲函數參數,因此'char * states []'不是一個指針數組。 – haccks

+1

@haccks:你說的沒錯。調用者的參數是一個數組的名稱,'sort'函數必須有一個允許傳遞該參數的原型。一個數組的名字會衰減到一個等於它的第一個元素地址的指針值,所以'sort'需要接受一個指向'char *'的指針。 – jxh

1

您需要的字符指針數組傳遞給函數:

#include <stdio.h> 
    #include <string.h> 
    #include <ctype.h> 
    #include <stdlib.h> 

    void sort(char *args[], int n); 

    int main() 
    { 
     char *states[4] = {"Florida", "Oregon", "California", "Georgia"}; 

     sort(states, 4); 

     return 0; 
    } 

    void sort(char *states[], const int N) 
    { 
     int x; 

     for (x = 0; x < N; x++) { 
      printf("\nState: %s\n", states[x]); 
     } 

    } 
0

你發送states這是一個array of pointers。所以,你需要的是數組的基地址發送到功能

sort(*states); 

然後接受它的指針只

void sort(char* states[]) 
{ 
    int x; 

    for (x = 0; x < 4; x++) { 
     printf("\nState: %s\n", states[x]); 
    } 

} 

似乎也並不是一個好主意硬編碼的大小的數組,所以最好將另一個參數size添加到函數調用中。

sort(states, sizeof(states)/sizeof(char*)); 

,後來用它來遍歷數組

void sort(char* states[], int size) 
{ 
    int x; 

    for (x = 0; x < size; x++) { 
     printf("\nState: %s\n", states[x]); 
    } 

} 
+1

'sort(states,sizeof(states));'不正確。 – artm

+0

@artm,thanx,編輯。 :) – Haris

1

的原因,只有你得到的數值是,只有到數組states的字符串states[0]的第一個元素指針傳遞,即在你正在通過&states[0][0]。因此,聲明

printf("\nState: %d\n", states[x]); 

將只打印字符串"Florida"的第一4字符的數值。

您需要將指針傳遞給數組states的第一個元素,即&states[0]
這可以通過改變功能sort的聲明符可以做

void sort(char **, size_t size); // You need to pass the size of array too. 

,並把它作爲

sort(states, sizeof(states)/sizeof(char *)); 
3

您需要解析數組的指針爲char到sort(而不只是指針字符)。

正如jhx指出的那樣,您還需要傳遞數組的大小。您可以使用sizeof以免硬編碼4。初始化時也省略數組大小。

void sort(char *states[], int arr_size) 
{ 
    int x; 

    for (x = 0; x < arr_size; x++) 
    { 
     printf("\nState: %s\n", states[x]); 
    } 
} 

int main() 
{ 
    char *states[] = {"Florida", "Oregon", "California", "Georgia"};  // array of pointers to char 

    sort(states, sizeof(states)/sizeof(char *)); 

    return 0; 
} 
+0

你能解釋一下sizeof(states)/ sizeof(char *)在做什麼嗎? – Andrew

+1

'states'是一個指向char的指針數組。 'char *'是一個指向char的指針。所以這個分區指定了'states'指針數組中元素的個數(即char指針的個數)。 – artm