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年左右的最新版本,如果启用了足够多的警告,将告诉您使用了错误的格式。其他编译器可能会,也可能不会。