我写了一个小程序来突出我在C中遇到的问题。我希望在下面的代码中,循环显示将打印0,但是退出null;然而,循环退出0.我到底想知道什么/我不理解?非常感谢您的帮助。
#include <stdio.h>
int main (void)
{
int i = 0;
int iArray[] = {1, 2, 0, 4, 5, '\0'};
int cArray[] = {1, 2, 0, 4, 5, '\0'};
for(i=0; iArray[i] != '\0'; i++)
{
printf("\nElement: %d", iArray[i]);
}
for(i=0; cArray[i] != '\0'; i++)
{
printf("\nElement: %d", iArray[i]);
}
return 0;
}
谢谢, 丹
答案 0 :(得分:2)
字符文字'\0'
实际上与整数文字0
相同。所以它在数组中达到零时停止。
更准确地说,'\0'
是八进制值为零。具有前导零的所有字符(当然还有字符串)转义序列都是八进制值,并且将由编译器“按原样”插入。
对于数组,还有另一种查找结束的方法,即获取数组中的项数,如
for(i=0; i < sizeof(iArray) / sizeof(iArray[0]); i++)
然而,使用例如获取数组中项目数的sizeof(iArray) / sizeof(iArray[0])
仅适用于实数组。只要你传递一个数组(例如作为一个函数的参数),它就会衰减到一个指针并且不再能使用“技巧”。
答案 1 :(得分:2)
0 == '\0'
因此iArray[i] != '\0'
与iArray[i] != 0
并且您的数组在第三个元素中包含0
,因此for循环将仅打印每个数组的2个第一个元素。
答案 2 :(得分:1)
你缺少引号,你似乎想要创建一串数字。数字'1'
与值1
的字符不同。
此外,您的数组是int
,当时它们应该是char
。
尝试:
const char iArray[] = { '1', '2', '0', '4', '5', '\0'};
当然可以更简单地写为:
const char iArray[] = "12045";
答案 3 :(得分:1)
因为0
和'\0
是等效的。实际上第一个是数字,第二个是char,当插入数组时,它被转换(转换)为int。可能你想创建一个字符串,所以创建一个char
类型的数组,用'0'
引号括起每个数字,并用%d
替换%c
。
注意:'0'
代表字符零,与文字0
和等效'\0'
不同,正如您在the ASCII table上看到的那样。 1
与'1'
如果你想要一个整数数组,那么你不能使用'\0'
作为终结符,因为第一句中所述的原因(除非你确定0不会出现在数组中),保持长度为在某处使用数组并将其用于迭代。