在C中使用while循环计算数组中的元素数 #包括 int main(){ int x[]={22,8,87,76,45,43,34,13,51,15}; 整数计数=0; 而(x[计数]!='\0'){ 计数++; } printf(“%d”,计数); 返回0; }
我不明白为什么这个程序给我的输出是12,而它应该是10。错在哪里?还有其他方法知道元素的数量吗?因为我必须进一步使用它来计算给定数据的中值在C中使用while循环计算数组中的元素数 #包括 int main(){ int x[]={22,8,87,76,45,43,34,13,51,15}; 整数计数=0; 而(x[计数]!='\0'){ 计数++; } printf(“%d”,计数); 返回0; },c,C,我不明白为什么这个程序给我的输出是12,而它应该是10。错在哪里?还有其他方法知道元素的数量吗?因为我必须进一步使用它来计算给定数据的中值 请任何人帮我澄清这个疑问。提前谢谢 此条件x[计数]!='\0'不正确。只有在处理字符串时才正确,在这种情况下,'\0'代表字符串的结尾,否则,在处理数组时,必须携带一个变量以获取数组的长度。您可以通过sizeof(count)/sizeof(count[0])获得此大小 事实上,x[count]可以指向内存的任何点,x是原点,count是偏移量,这就是为什
请任何人帮我澄清这个疑问。提前谢谢 此条件
x[计数]!='\0'
不正确。只有在处理字符串时才正确,在这种情况下,'\0'
代表字符串的结尾,否则,在处理数组时,必须携带一个变量以获取数组的长度。您可以通过sizeof(count)/sizeof(count[0])获得此大小代码>
事实上,x[count]
可以指向内存的任何点,x
是原点,count
是偏移量,这就是为什么您可以访问count[11]
例如。只有在从字符串文本初始化时才添加NUL
#include <stdio.h>
int main() {
int x[] = {22, 8, 87, 76, 45, 43, 34, 13, 51, 15};
int count = 0;
while (x[count] != '\0') {
count++;
}
printf("%d", count);
return 0;
}
由于您的数组不包含'\0'
(0
),因此您读取的内容会超过它的结尾,直到刚好碰到0
。这是未定义的行为
您可以添加一个零:
char a1[] = "abc"; // 4 elements: 0x61, 0x62, 0x63, 0x00.
char a2[] = { 'a', 'b', 'c' }; // 3 elements: 0x61, 0x62, 0x63.
char a3[] = { 97, 98, 99 }; // 3 elements: 0x61, 0x62, 0x63.
#包括
内部主(空){
int x[]={22,8,87,76,45,43,34,13,51,15,0};
大小\u t计数=0;
而(x[计数]){
计数++;
}
printf(“%zu\n”,计数);
}
也就是说,使用here看起来很奇怪。通常使用数组的大小
#include <stdio.h>
int main(void) {
int x[] = { 22, 8, 87, 76, 45, 43, 34, 13, 51, 15, 0 };
size_t count = 0;
while (x[count]) {
count++;
}
printf("%zu\n", count);
}
#包括
内部主(空){
int x[]={22,8,87,76,45,43,34,13,51,15};
size_t count=sizeof(x)/sizeof(x[0]);
printf(“%zu\n”,计数);
}
int的数组不一定以零结尾。char
的数组有时是空的。但在任何情况下,如果您拥有数组本身,而不仅仅是指向数组的指针,那么下面是获得数组大小的方法:
#include <stdio.h>
int main(void) {
int x[] = { 22, 8, 87, 76, 45, 43, 34, 13, 51, 15 };
size_t count = sizeof(x) / sizeof(x[0]);
printf("%zu\n", count);
}
请注意,如果将数组作为参数传递给函数,则此操作将不起作用,因为这样一来,大小信息将丢失在函数中。正如您正确指出的,数组有10个元素
size_t const count = sizeof(x) / sizeof(*x);
在这些元素中,没有一个哨兵值等于'\0'
`
因此,由于访问数组外部的内存,循环调用未定义的行为
#include <stdio.h>
int main(void) {
int x[] = { 22, 8, 87, 76, 45, 43, 34, 13, 51, 15, 0 };
size_t count = 0;
while (x[count]) {
count++;
}
printf("%zu\n", count);
}
可以将值等于0的元素附加到数组中,如
int x[] = {22, 8, 87, 76, 45, 43, 34, 13, 51, 15};
在本例中,循环
int x[] = {22, 8, 87, 76, 45, 43, 34, 13, 51, 15, 0 };
将计算除最后一个之外的所有元素。因此,您需要在循环之后增加变量count
,最后一个元素也是count
或者你可以像这样重写循环
while (x[count] != '\0') {
count++;
}
要获取数组中的元素数,可以获取其大小,然后将其除以元素的大小。比如说
while ( x[count++] );
或
甚至像
size_t count = sizeof( x ) / sizeof( *x );
因为运算符sizeof
不计算使用的表达式。您是否尝试过sizeof(x)/sizeof(x[0])注意:main()
是古语。使用intmain(void)
我尝试将其卸载并输出10。发布的源与您尝试的源相同吗?错误在于循环访问超过x
结尾的元素,并且具有未定义的行为。这意味着它可以合法地做任何事情-打印值12
,打印值10
,重新安装操作系统,…使用sizeof
我不认为在int
数组的末尾加零来表示数组的结尾是个好主意。@machine\u 1,我已经说过很多了。我展示了使OP的代码工作所需的内容,并展示了通常使用的内容。使用sentinel值有其优点和缺点。它们仍然被大量使用。这可能不是最好的选择,但是没有办法知道。@machine_1,那里,现在有点明确了。
size_t count = sizeof( x ) / sizeof( x[1000] );