2012-07-21 161 views
-1

我正在尝试使用C来计算数组中元素的数量。我尝试了下面的代码。但是,每次运行程序时它都会返回83。我的意思是计算元素的数量是我需要知道我们输入的元素的数量,而不是数组的大小。计算数组中的元素数 - C

#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"); 
} 
+2

你去使用C深入讨论之前,请阅读一本好书。 – dreamlax 2012-07-21 11:27:48

+0

@dreamlax对不起,这是我复制的代码片段。请立即查看 – Srivathsan 2012-07-21 11:30:50

+0

好得多!但仍然不太正确...因为您只设置前6个元素的值,其余的元素具有不确定的值,并且不能像循环中那样依赖未初始化的值。一旦'i'超过5,它就开始读取阵列中未初始化的值,这是不好的。 – dreamlax 2012-07-21 11:35:10

回答

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' 
+0

抱歉,这是我抄录的错误代码。请现在看看吧 – Srivathsan 2012-07-21 11:30:37

+0

啊我明白了。我相应地修改了我的答复。 – ATaylor 2012-07-21 11:34:44

+0

由于OP用C标记并且正在使用C头文件,C++可能不是这里的正确解决方案吗? – 2012-07-21 16:52:17

0

更新基于新代码:

一般情况下,你需要一种方法来识别,以做一个正确的计数的数组的末尾。对于字符串,通常使用'\0'。对于其他数据类型,您必须提供自己的值来检查。

对于上述特定的代码示例:

您需要自己插入到\0在最后位置的阵列,因此您计数会工作。 (当你创建一个像“hello”这样的字符串时,'\0'会自动放在字符串的末尾,但是如果你按字符创建了一个字符串)。

或者,检查字符'5'以查找当前字符数组的末尾。另外,一旦找到最后一个字符,你应该从循环中取出break,否则你将要经过数组的末尾,很有可能会崩溃(如果你不是这么做的话)。即是这样的:如果你

if(a[i] == '\0'){ 
     break; 
    } 

将工作:

a[6] = '\0'; 

之前。

由于C不检查数组边界,它可能会出现与当前的代码,你看似摆脱这一点,但它是侥幸该程序不会崩溃,可以从运行改变运行。换句话说,这是undefined的行为。

最后,你当然也可以使用strlen(),如果你正在处理字符串。

2

C中的数组是固定大小。他们不扩大。你的array有两个条目;写入array[2],array[3]等调用未定义的行为。换句话说,它是无效的代码。

如果您希望能够插入任意数量的元素,则需要使用动态分配的内存,手动跟踪您插入的元素数量,并在需要调整大小时使用realloc

+0

对不起,这是我复制的代码片段。请现在检查它 – Srivathsan 2012-07-21 11:30:56

1

做到这一点,而不是:

main(){ 

    int a[100] = {0}; 
    int j = 0; 
    int i = 0; 

    // other stuff