2011-11-08 83 views
5

我聲明如下數組:如何在C中查找「char *」數組的長度?

char* array [2] = { "One", "Two"}; 

我通過此數組的函數。我如何在函數中找到這個數組的長度?

+1

焦炭星級==字符指針 –

+2

順便說一句,使用'I'代替'i'可能有助於避免「這是一個合理的問題」啓發式(除了讓英語母語人士更容易閱讀這個問題)。 – sarnold

回答

17

將數組長度傳遞給函數後無需額外努力就無法找到數組的長度。你需要:

  1. 使用的容器存儲的大小,如vector推薦)。
  2. 傳遞大小。這可能需要對現有代碼進行最少的修改,並且是最快的修復。
  3. 使用標記值,如C字符串做。這使得查找數組的長度爲線性時間操作,並且如果您忘記了標記值,您的程序可能會崩潰。這是在大多數情況下最糟糕的方式。
  4. 使用模板在傳遞數組時減去數組的大小。你可以在這裏讀到它:How does this Array Size Template Work?

如果你想知道,大多數人感到遺憾的是C字符串以這種方式工作。

+0

因此他們發明了B字符串。 –

+0

@MooingDuck鏈接請:)谷歌是關於這個問題的媽媽 –

+0

Apperently的正確名稱爲[BSTR(http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(V = vs.85 )的.aspx)(討厭的人比C字符串) –

6

當你通過一個數組有不是一個簡單的方法來確定函數內的大小。

您可以傳遞數組大小作爲一個參數 或 使用的std ::矢量<的std :: string>

如果你感覺特別冒險可以使用some advanced template techniques

簡而言之,它看起來像

template <typename T, size_t N> 
void YourFunction(T (&array)[N]) 
{ 
    size_t myarraysize = N; 
} 
+0

是的,這就是我目前正在做什麼,但我想刪除多餘的paramater。哦,還有 – bubbles

+0

還有一個std :: array 類。 –

+3

@bubbles'int main(argc,char ** argv)'。如果它很簡單,主要做法會有所不同。 –

0

如果你的意思是所有字符串添加到集合中的時間有多長。

int n=2; 
int size=0; 
char* array [n] = { "One", "Two"}; 

for (int i=0;i<n;++i) 
    size += strlen(array[i]; 

補充:

是那目前在做什麼IM,但我想刪除多餘的 paramater。哦,很好 -

可能會得到一個不好的迴應,但你總是可以使用第一個指針來存儲大小,只要你不尊重它或錯誤它實際上是一個指針。

char* array [] = { (char*)2,"One", "Two"}; 

long size=(long)array[0]; 
for(int i=1; i<= size;++i) 
    printf("%s",array[i]); 

或者你可以NULL終止您的陣列

的char *數組[] = { 「一」, 「二」,(字符*)0};

for(int i=0;array[i]!=0;++i) 
{ 
    printf("%s",array[i]); 
} 
0

從指針獲取數組大小是不可能的。你可以用NULL指針終止數組。這樣你的函數可以搜索NULL指針來知道大小,或者乾脆停止處理輸入,一旦它達到NULL ...

2

C在你背後做了一些詭計。

void foo(int array[]) { 
    /* ... */ 
} 

void bar(int *array) { 
    /* ... */ 
} 

這兩個是相同的:

6.3.2.1.3:除了當它是sizeof運算符的操作數或一元&操作者, 或是用於初始化一個字符串文字一個數組,具有類型爲''的類型爲 ''的數組的表達式被轉換爲類型爲''的指針的類型爲'' 的表達式,該表達式指向數組對象的初始元素並且不是左值。如果 數組對象具有寄存器存儲類,則行爲是未定義的。

其結果是,不知道,內部foo()bar(),如果你 調用陣列,陣列的一部分,或一個指向單個 整數:

int a[10]; 
int b[10]; 
int c; 

foo(a); 
foo(&b[1]); 
foo(&c); 

有些人喜歡寫自己的功能,如:void foo(int *array) 只是提醒自己,他們並沒有真正傳遞了陣列, 而是指向一個整數的指針,可能有或沒有更多 附近的其他地方。有些人喜歡編寫他們的功能 ,比如:,以便更好地提醒自己 函數期望傳遞給它。不管你喜歡這樣做,如果你想知道你的 陣列多久哪種方式

,你有幾種選擇:

  1. 通行證沿長度paramenter了。 (Think int main(int argc, char *argv))。
  2. 設計你的數組,使得每個元素不是NULL,除了最後一個 元素。 (想想char *s="almost a string";execve(2)。)
  3. 設計你的函數,這樣它需要一些 參數的其他描述符。 (認爲​​printf("%s%i", "hello", 10); - 字符串描述 其他參數。printf(3)使用stdarg(3)參數處理,但 它可能很容易是一個數組。)
+1

瑣事:'argv'確實指向了1和2。 – u0b34a0f6ae