我正在尝试使用C计算数组中的元素数。我尝试了以下代码。但每次运行程序时它只返回83。计算元素数量的意思是我需要知道输入的元素数量而不是数组的大小。
#include<stdio.h>
#include<stdlib.h>
main(){
int a[100], j = 0, i;
a[0] = '0';
a[1] = '1';
a[2] = '2';
a[3] = '3';
a[4] = '4';
a[5] = '5';
for(i=0; i<100; i++){
if(a[i] == '\0'){
}
else
j = j + 1;
}
printf("%d", j);
system("pause");
}
答案 0 :(得分:2)
C中的数组是固定大小。它们不会扩展。您的array
有两个条目;写入array[2]
,array[3]
等会调用未定义的行为。换句话说,它是无效的代码。
如果您希望能够插入任意数量的元素,则需要使用动态分配的内存,手动跟踪已插入的元素数,并在需要调整大小时使用realloc
。
答案 1 :(得分:1)
由于OP修改了他的代码,这里是一个更正确的答复: 此代码“偶然”工作,因为您之前没有初始化数组。 这只是'运气',在那里的某个地方,价值0出现了。
数组的声明不会将其归零。 使用:
memset(a, 0, 100);
为此。这样,第一个“未被覆盖”的字节将返回“0”。 参考:http://www.cplusplus.com/reference/clibrary/cstring/memset/
或者,您必须通过添加[x] = 0;
手动设置'分隔'现在,我知道你特意要求'C'解决方案,但是如果你想考虑使用C ++ - 编译器,我建议你看一下C ++的stl。 这是一个帮助您入门的链接:http://www.cplusplus.com/reference/stl/list/
它被初始化为:
list<char>List;
List.push_back(1);
List.push_back(2);
List.push_back('a');
int j = List.size(); //Returns '3'
答案 2 :(得分:1)
改为:
main(){
int a[100] = {0};
int j = 0;
int i = 0;
// other stuff
答案 3 :(得分:0)
根据新代码进行更新:
通常,您需要一种方法来识别数组的结尾,以便进行正确的计数。对于字符串,通常使用'\0'
。对于其他数据类型,您必须提出自己的值来检查。
对于上面的特定代码示例:
您需要在最后一个位置将\0
自己插入到数组中,以便您的计数有效。 (当你创建一个像“hello”这样的字符串时,'\0'
会在字符串的末尾自动输入,但是如果你逐字符地创建一个字符串则不会。)
或者,检查字符'5'
以查找当前字符数组的结尾。
此外,一旦找到最后一个字符,你应该break
离开循环,否则你将超过数组的末尾并且很可能会崩溃(再次,如果你不这样,那么纯粹的运气) 。即,像:
if(a[i] == '\0'){
break;
}
如果您这样做,将起作用:
a[6] = '\0';
之前。
由于C不检查数组边界,可能看起来使用当前代码,貌似侥幸逃脱了这一点,但是纯粹的运气该程序没有崩溃,可能会从一次运行变为运行。换句话说,这是未定义行为。
最后,如果你正在处理字符串,你当然也可以使用strlen()
。