2016-01-14 52 views
2

我想保存數組中有多少個空元素。這是我迄今爲止所做的,但它打印出所有行都是「不空」,這是錯誤的。 我該怎麼做?如何檢查數組中有多少元素爲空?

char arr[10][50]={NULL}; 
int lines; 

//inserting values to arr 

for(int i=0;i<10;i++){ 
    if(arr[i] == NULL){ 
     lines++; 
     printf("empty"); 
    } 
    else 
     printf("not empty"); 
} 
+0

調試器說什麼? –

+7

'arr'是一個2D數組,你爲什麼只檢查'arr [i]'而不是'arr [i] [j]'(這意味着你應該在j上增加一個循環)? – mikedu95

+1

您的初始化會導致編譯器警告:*「警告C4047:'正在初始化':'char'與」void *'「*的間接級別不同。你沒注意到嗎? –

回答

8

當你arr[i] == NULL然後arr[i]衰減到的指針數組的第一個元件在arr[i](即&arr[i][0]),並且指針將從未NULL

我懷疑你想要像arr[i][0] == '\0'

+3

此外,用NULL來初始化數組是欺騙性的,可能不是OP的意圖。 –

+0

非常感謝! – anonym

5

兩個問題:

  1. 此:

    char arr[10][50]={NULL}; 
    

    應該

    char arr[10][50]={{0}}; /* Initializes the whole 2D array with zeros */ 
    

    char arr[10][50]={{'\0'}}; /* Does the same thing as above; '\0' == 0 */ 
    

    個這裏的問題是:

    1. NULL通常與指針使用,但arr設計用於存儲char s和char s爲不是指針。
    2. 在初始化二維數組時,您應該使用一對額外的大括號,而不是一維數組。
  • 這裏:

    if(arr[i] == NULL) 
    

    你檢查你的2D陣列的每一行是NULL。換句話說,你正在檢查每個子數組是否有地址NULL。這不會是真實的,並且可能與你的想法相抵觸。

    @Joachim Pileborg's answer給出了關於這個問題的更多見解併爲其提供了一個可能的解決方案。

  • +0

    點1沒有意義:所有初始化都相同(有些自動轉換)。 – pmg

    +0

    @pmg使用'NULL'會爲我發出一個警告:'警告:初始化從指針開始整型而不投射' –

    +1

    @pmg在NULL被定義爲'(void *)0'的系統上,您將看到@Cool蓋伊報道。無論如何,在理解下一個必須維護這種代碼的人時,它在語義上是錯誤的和阻礙的。 –

    相關問題