返回在C中的数组中保存特定值的所有索引位置

时间:2015-10-07 05:24:39

标签: c arrays loops

编程新手,请耐心等待! 在C中,假设您有一个数组{0,1,0,1,0,0,0}。如何返回所有值为1的索引位置?所以在这种情况下,它将是{1,3}。当我在数组中查找最大/最小/出现次数时,我没有遇到任何麻烦,因为您可以保持持续的“计数”值。但是我不能理解这个,因为我没有看到for循环如何工作。这是我尝试过的:

for (i = 0; i < numValues; i++) {
   if (array[i] == 1) {
      result[i] = i;
} }

其中result []是一个新数组(我想我需要一个新数组,因为有超过1个输出)。但这只发现第一次出现并忘记了第二次出现。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

为事件保留单独的索引。如果result只需要保留出现次数,则需要保留两个数组(一个是临时的,一个是最终结果),或者是第一次通过array来查明出现的次数在进行第二次传递以复制索引之前存在或匹配。以下是使用两个数组的方法:

int occurence = 0;
int* occurrences = malloc(sizeof(int) * numValues);
for (int i = 0; i < numValues; i++) {
    if (array[i] == 1) {
        occurrences[occurence++] = i;
    }
}
int* result = malloc(sizeof(int) * occurence);
for (int i = 0; i < occurence; i++) {
    result[i] = occurrences[i];
}
free(occurrences);
/* do stuff with result... */
free(result);

您可以通过result调整每场比赛的realloc数组来一次性完成,但这需要更多时间。

答案 1 :(得分:1)

由于您是编程新手,让我们简单一点。 让我们假设您并不担心result持有的空间/内存。

int onesCount = 0; // number of 1(s) count
for (i = 0; i < numValues; i++) {
   if (array[i] == 1) {
      result[onesCount] = i;
      onesCount++;
   }
}