在C中使用while循环计算数组中的元素数 #包括 int main(){ int x[]={22,8,87,76,45,43,34,13,51,15}; 整数计数=0; 而(x[计数]!='\0'){ 计数++; } printf(“%d”,计数); 返回0; }

在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是偏移量,这就是为什

我不明白为什么这个程序给我的输出是12,而它应该是10。错在哪里?还有其他方法知道元素的数量吗?因为我必须进一步使用它来计算给定数据的中值


请任何人帮我澄清这个疑问。提前谢谢

此条件
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] );