2013-10-20 50 views
4

我等的輸入功能:如何查找C中動態2D char數組中的行數?

int func(char* s[]) 
{ 
    // return number of rows in the character array s 
} 

在字符數組s的隨機作爲用於例如提供:{ 「sdadd」, 「dsdsd」, 「dsffsf」, 「ffsffsf」}。

這裏輸出應該是4以上例子。

+0

通常(例如,在主要的'argv'),那麼可以讓指針數組中的最後一個元素爲空指針,這樣遍歷它就等於測試null:'for(int i = 0; s [i]; i ++){/ * use s [i] * /}'。初始化看起來像「{」sdadd「,」dsdsd「,」dsffsf「,」ffsffsf「,NULL}' –

回答

4

傳遞字符串數組需要更多信息...

這類似於你會發現在輸入說int main(int argc, char *argv[])通話。例外情況是,當調用main()時,它讀取命令行並在argc中提供計數信息至,確定參數的數量爲argv[]。這就是爲什麼char *argv[]參數可以通過。

您有相同的要求。那就是當傳遞一個參數如char *s[],也就是說,你必須以某種方式提供一個值告訴func()有多少個字符串。 C沒有辦法知道變量中的字符串數量。這是因爲數組引用(char * s [];)衰減爲指向char(char * s;)的指針,指向該數組的第一個元素,即沒有數組大小信息。

所以,回答你的問題是:給定的信息,func()無法確定s串的數量。

的一個重要區別
大小CAN字符數組來確定,如

char *s[]={"this","is","an","array"}; // the assignment of values in {...} 
             //make this an array of strings. 

但只有當s在同一範圍內的被聲明函數試圖確定元素的數量。如果條件滿足,那麼使用:

int size = sizeof(s)/sizeof(s[0]); //only works for char arrays, not char * 
            //and only when declared and defined in scope of the call 

在範圍,在這種情況下,簡單的說就是字符* S [] ...與全球知名度定義,或在功能計算元素的數量。如果作爲參數傳遞,那麼上面定義的char * s [];將被簡單地看作char * s,並且參數的個數不能確定。

爲一個字符串數組檢索字符串的計數的其他選項包括:
1)修改您的輸入數組,這樣的東西最後一個字符串中是獨一無二的,像「%」或「 \ 0" 。這將允許您使用標準C字符串函數測試字符串。

2)在提供字符串數的函數中包含參數。 (例如,類似於main(...)printf(...)

-1
int size = sizeof(s)/sizeof(s[0]); 

這一說法。可變大小將被分配*s[]中存在的字符串的數量。

2

與C中的所有數組參數一樣,沒有辦法這麼做,因爲當作爲函數參數傳遞時,數組會衰減爲指向其第一個元素的指針(有關C FAQ的討論,請參見http://c-faq.com/aryptr/)。

一如既往在這種情況下,你有兩種可能性。

  1. 使用結束標記。如果數組的元素類型可以保存一個特殊的值,那麼對於那個類型就不會「自然地」出現,這總是有效的。對於'\ 0'的字符,對於你的數組中的NULL指針,空指針。例如argv[]main()的第二個參數,由空指針終止。這使得迭代變得容易:

    #include<stdio.h> 
    int main(int argc, char *argv[]) 
    { 
        int i; 
        for(i=0; argv[i] != NULL; i++) 
        { 
         printf("%s\n", argv[i]); 
        } 
        return 0; 
    } 
    
  2. 傳遞一個長度信息與數組。有意思的是,C運行庫中的信息在argc中也傳遞給main()

除此之外沒有(或至少沒有便攜式)的方法來知道有多少個元素的數組已被作爲一個參數中C.傳遞到功能