2010-11-30 51 views
1

可能重複:
nul terminating a int array內C - 整數數組0和 0區分

我試圖打印出數組中的所有元素:

int numbers[100] = {10, 9, 0, 3, 4}; 
printArray(numbers); 

使用此功能:

void printArray(int array[]) { 
    int i=0; 
    while(array[i]!='\0') { 
     printf("%d ", array[i]); 
     i++; 
    } 
    printf("\n"); 
} 

問題是,當然C不陣列中的只是另一個零元件和陣列的端部,在這之後它的所有0(也記譜\ 0)之間進行區分。

我知道,有語法介於0 \ 0沒有區別,所以我一直在尋找一種方式或破解來實現這一目標:

10 9 0 3 4 

,而不是這個

10 9 

該陣列還可以是這樣的:{0,0,0,0}這樣的過程中,輸出仍然需要0 0 0 0

任何想法?

+0

謝謝我看到它並投票結束,我爲它做了一點小事。 – Gal 2010-11-30 21:53:49

+0

通常,在字符上下文中使用`'\ 0'`來引用null,並在整數上下文中使用`0`。編譯器對待它們的方式幾乎相同,但對於讀取代碼的程序員有不同的含義。看到比較'int i`到`'\ 0'`的代碼在我腦海中觸發警告。分配`* str = 0`而不是`* str ='\ 0'`。 – tomlogic 2010-11-30 23:15:34

回答

9

不要使用也可能在數組中的值終止數組。

你需要找到一個UNIQUE終止。

既然你沒有說明你的陣列中的任何負數,我建議您用-1終止:

int numbers[100] = {10, 9, 0, 3, 4, -1}; 

如果不行,可以考慮:INT_MAX,或INT_MIN

作爲最後的手段,編碼序列保證不在您的數組中,例如:-1, -2, -3它表示終止。

沒有什麼「特別的」關於與0\0終止。終止與您的案件的任何作品。


如果陣列確實可以以任意順序保存所有值,則終止是不可能的,你會跟蹤數組的長度。

從你的例子,這將是這樣的:

int numbers[100] = {10, 9, 0, 3, 4}; 
int Count = 5; 
int i; 

for(i=0; i<Count; ++i) 
{ 
    // do something with numbers[i] 
} 
0

對於聲明爲

int numbers[100] = {10, 9, 0, 3, 4}; 

數組但絕對沒有辦法從使用到隱零區分明確0在初始化初始化數組的尾部。它們是相同的零。所以,你想做的事情不能從字面上完成。

要做到這一點,唯一的方法是選擇一些int值作爲保留的專用終止符值,並始終將其明確添加到數組末尾。即如果你選擇-42作爲終止值,你必須將其聲明爲

int numbers[100] = {10, 9, 0, 3, 4, -42}; 

和迭代高達你的週期第一-42

0

實現這種典型的方式是:

  • 定義一個哨兵值(其它建議)
  • 定義與一個int(實際值)結構和一個布爾值(表示如果它是定點)和使這些陣列代替
  • 傳遞數組的長度與陣列
  • 定義包含兩個陣列和長度的結構體,並傳遞代替

請注意,第一項和第二項幾乎完全相同。