2013-05-18 41 views
1

寫入程序時,我正在用數字填充char數組的條目。在這樣做之後,對於沒有零的數組計算的長度是正確的,但對於從零開始的數組是零!未定義的程序行爲

爲什麼這個結果會如此!我無法解釋我的錯誤!?

int main() 
{ 
    int number_of_terms,no,j,i; 
    char arr[100]; 
    char c; 
    scanf("%d",&number_of_terms); 
    for(i=0;i<number_of_terms;i++) 
    { 
     j=0; 
     while(c!='\n') 
     { 
      scanf("%d",&arr[j]); 
      if(c=getchar()=='\n') 
      break; 
      j++; 
     } 
     printf("Length is:%d\n",strlen(arr)); 
    } 
    return 0; 
} 

for eg if i input my array elements as 4 5 
lenght is 2 
and if my array elements as 0 5 
length is 0.. 
+3

並且'c = getchar()=='\ n''等於'c =(getchar ()=='\ n')',你可能不想要。 – Lennart

+0

無論你聲明,請給它一個initalizer。不要讓它漂浮。輸入可能會失敗,這會使您的變量處於舊狀態(根據您的代碼不確定)。 –

回答

2

您在格式說明符中使用「%d」,該格式說明符生成一個整數,並且傳入字符數組的地址。這就像你的標題所說的,未定義的行爲。特別是,零值將佔用字符串中的四個單元格,並將零寫入所有這些。由於值爲零的字符是結束標記,因此您會得到零長度的字符串。但是,在另一種體系結構中,第二個字符可能會導致崩潰...

如果要將整數存儲在數組中,則應該使用int arr[...];。如果你想存儲字符,使用「%c」。

+0

雖然現在的編譯器應該不是很漂亮嗎? – Cubic

+0

gcc的最近版本(在過去10年左右),如果啓用了足夠多的警告,則會告訴您使用的格式不正確。其他編譯器可能會也可能不會。 –

2

您正在將值0複製到數組中。這意味着字符'\ 0'用於終止字符串。你想要的是複製字符'0'(具有值48,見ascii表)。

將%d更改爲%c來解釋輸入具有字符而不是小數。

scanf("%c",&arr[j]); 

此外,您的「字符串」在arr不是零終止。在字符串的所有字符之後,必須結束字符串的值0(這裏的小數是正確的)。 strlen需要它,因爲它通過遍歷數組並確定字符串的長度,直到找到0爲止。