2013-05-18 39 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为止。