2012-07-21 208 views
-1

我正在嘗試使用C來計算數組中元素的數量。我嘗試了下面的代碼。但是,每次運行程序時它都會返回83。我的意思是計算元素的數量是我需要知道我們輸入的元素的數量,而不是數組的大小。計算數組中的元素數 - C

#include<stdio.h> 
#include<stdlib.h> 
main(){ 

int a[100], j = 0, i; 

a[0] = '0'; 
a[1] = '1'; 
a[2] = '2'; 
a[3] = '3'; 
a[4] = '4'; 
a[5] = '5'; 

for(i=0; i<100; i++){ 

     if(a[i] == '\0'){ 

     }   
     else 
      j = j + 1;   
} 

printf("%d", j); 

system("pause"); 
} 
+2

你去使用C深入討論之前,請閱讀一本好書。 – dreamlax 2012-07-21 11:27:48

+0

@dreamlax對不起,這是我複製的代碼片段。請立即查看 – Srivathsan 2012-07-21 11:30:50

+0

好得多!但仍然不太正確...因爲您只設置前6個元素的值,其餘的元素具有不確定的值,並且不能像循環中那樣依賴未初始化的值。一旦'i'超過5,它就開始讀取陣列中未初始化的值,這是不好的。 – dreamlax 2012-07-21 11:35:10

回答

1

由於OP修改了他的代碼,因此以下是更正確的回覆: 由於您之前沒有初始化陣列,因此此代碼「偶然」起作用。 這只是'運氣',在那裏的某個地方,價值0出現。

數組的聲明不會將其歸零。 使用:

memset(a, 0, 100); 

爲此。這樣,第一個'未被覆蓋'的字節將返回'0'。 參考:http://www.cplusplus.com/reference/clibrary/cstring/memset/

或者,您必須手動設置'分隔'通過添加一個[x] = 0;現在,我知道你特別要求'C'解決方案,但是如果你想考慮使用C++編譯器,我建議看看C++的stl。 這裏有一個鏈接,讓你開始:http://www.cplusplus.com/reference/stl/list/

它初始化爲:

list<char>List; 
List.push_back(1); 
List.push_back(2); 
List.push_back('a'); 

int j = List.size(); //Returns '3' 
+0

抱歉,這是我抄錄的錯誤代碼。請現在看看吧 – Srivathsan 2012-07-21 11:30:37

+0

啊我明白了。我相應地修改了我的答覆。 – ATaylor 2012-07-21 11:34:44

+0

由於OP用C標記並且正在使用C頭文件,C++可能不是這裏的正確解決方案嗎? – 2012-07-21 16:52:17

0

更新基於新代碼:

一般情況下,你需要一種方法來識別,以做一個正確的計數的數組的末尾。對於字符串,通常使用'\0'。對於其他數據類型,您必須提供自己的值來檢查。

對於上述特定的代碼示例:

您需要自己插入到\0在最後位置的陣列,因此您計數會工作。 (當你創建一個像「hello」這樣的字符串時,'\0'會自動放在字符串的末尾,但是如果你按字符創建了一個字符串)。

或者,檢查字符'5'以查找當前字符數組的末尾。另外,一旦找到最後一個字符,你應該從循環中取出break,否則你將要經過數組的末尾,很有可能會崩潰(如果你不是這麼做的話)。即是這樣的:如果你

if(a[i] == '\0'){ 
     break; 
    } 

將工作:

a[6] = '\0'; 

之前。

由於C不檢查數組邊界,它可能會出現與當前的代碼,你看似擺脫這一點,但它是僥倖該程序不會崩潰,可以從運行改變運行。換句話說,這是undefined的行爲。

最後,你當然也可以使用strlen(),如果你正在處理字符串。

2

C中的數組是固定大小。他們不擴大。你的array有兩個條目;寫入array[2],array[3]等調用未定義的行爲。換句話說,它是無效的代碼。

如果您希望能夠插入任意數量的元素,則需要使用動態分配的內存,手動跟蹤您插入的元素數量,並在需要調整大小時使用realloc

+0

對不起,這是我複製的代碼片段。請現在檢查它 – Srivathsan 2012-07-21 11:30:56

1

做到這一點,而不是:

main(){ 

    int a[100] = {0}; 
    int j = 0; 
    int i = 0; 

    // other stuff