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..
4

2 回答 2

2

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

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

于 2013-05-18T10:43:41.240 回答
2

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

将 %d 更改为 %c 以解释输入有字符而不是十进制。

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

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

于 2013-05-18T10:44:06.187 回答