Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 程序的未定义行为_C_Arrays - Fatal编程技术网

C 程序的未定义行为

C 程序的未定义行为,c,arrays,C,Arrays,在编写程序时,我用数字填充字符数组的条目。执行此操作后,为没有零的数组计算的长度是正确的,但对于以零开始的数组,计算的长度是零 为什么会有这样的结果!我无法解释我的错误 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++) {

在编写程序时,我用数字填充字符数组的条目。执行此操作后,为没有零的数组计算的长度是正确的,但对于以零开始的数组,计算的长度是零

为什么会有这样的结果!我无法解释我的错误

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

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


如果要在数组中存储整数,应使用int-arr[…];。如果要存储字符,请使用%c

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


如果要在数组中存储整数,应使用int-arr[…];。如果要存储字符,请使用%c

您正在将值0复制到数组中。此eqals用于终止字符串的字符“\0”。您需要的是复制值为48的字符“0”,请参阅ascii表格

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

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

此外,arr中的字符串不是以零结尾的。在字符串的所有字符之后,您必须以值0结束字符串,这里的小数点是正确的。strlen需要它,因为它通过遍历数组并向上计数直到找到0来确定字符串的长度。

您正在将值0复制到数组中。此eqals用于终止字符串的字符“\0”。您需要的是复制值为48的字符“0”,请参阅ascii表格

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

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

此外,arr中的字符串不是以零结尾的。在字符串的所有字符之后,您必须以值0结束字符串,这里的小数点是正确的。strlen需要它,因为它通过遍历数组并向上计数直到找到一个0来确定字符串的长度。

并且c=getchar='\n'等于c=getchar='\n',这可能是您不想要的。无论您声明什么,请给它一个初始化器。不要让它漂浮着。输入可能会失败,这将使您的变量处于旧状态,而旧状态根据您的代码是不确定的。并且c=getchar='\n'等于c=getchar='\n',这可能是您不想要的。无论您声明什么,请给它一个初始化器。不要让它漂浮着。输入可能会失败,这将使您的变量处于旧状态,这在您的代码中是不确定的。但是,几乎任何现代编译器都不应该捕捉到这一点吗?gcc过去10年左右的最新版本,如果启用了足够多的警告,将告诉您使用了错误的格式。其他编译器可能会也可能不会。但是,几乎所有现代编译器都不应该捕捉到这一点吗?gcc过去10年左右的最新版本,如果启用了足够多的警告,将告诉您使用了错误的格式。其他编译器可能会,也可能不会。