程序的未定义行为

时间:2013-05-18 10:39:54

标签: c arrays

在编写程序时,我正在用数字填充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..

2 个答案:

答案 0 :(得分:2)

您在格式说明符中使用“%d”,它会生成一个整数,并且您传入的是字符数组的地址。就像你的标题所说的那样,这是一种未定义的行为。特别是,零值将占用字符串中的4个单元格,并将零写入所有这些单元格。由于值为零的字符是结束标记,因此您将获得零长度字符串。但是,在另一个架构上,第二个角色可能会导致崩溃......

如果要将整数存储在数组中,则应使用int arr[...];。如果要存储字符,请使用“%c”。

答案 1 :(得分:2)

您正在将值0复制到数组中。这个字符'\ 0'用于终止字符串。你想要的是复制字符'0'(值为48,参见ascii表)。

将%d更改为%c以解释输入具有字符而不是小数。

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

arr中的“字符串”也不会终止。在字符串的所有字符之后,您必须以值0结束字符串(这里的小数是正确的)。 strlen需要它,因为它通过遍历数组并计算直到找到0来确定字符串的长度。