首页 > 解决方案 > 如何在C代码中使用给定的输入数组生成特定值的数组

问题描述

标题可能有点混乱,所以我将在这里更详细地解释我的目标;我想编写一个代码,该代码采用 x 数字的输入数组

index_x = [0,0,1,0,1,0,0,0,1,0,0,1,0];

然后我想编写一个逻辑,它将生成一个包含所有 1 索引的数组

index_ones = [3,5,9,12];

当前代码从 Jacon 稍作修改:

编辑1:

#include <stdio.h>

int index_x[] = {0,0,1,0,1,0,0,0,1,0,0,1,0};      // any number of elements
int len = 12;

int main(void) {

    int arr[len];
    int j = 0;

    for (int i = 0; i < len; i++)
        if (index_x[i])
            arr[j++] = i;                     // save and advance j only if value is "1"

    for (int i = 0; i < j; i++)               // only print below j !
        printf("%d\n", arr[i]);
}

输出:

2
4
8
11

从这个输出中,我想生成另一个数组,它是这些元素之间的差异。在这种情况下,新数组将是 {2,4,3}。

编辑 2:我将把它移到另一个线程,因为讨论现在已经从一个问题转移到另一个问题。不想让未来的用户复杂化。

标签: arrayscindexingelement

解决方案


由于您不知道需要多少索引,因此您需要动态分配内存。您还需要记住索引的数量

struct index
{
    size_t size;
    size_t indexes[];
};


struct index *addIndex(struct index *index, size_t pos)
{
    size_t new_size = index ? index -> size + 1 : 1;

    index = realloc(index, sizeof(*index) + new_size * sizeof(index -> indexes[0]));
    if(index)
    {
        index -> size = new_size;
        index -> indexes[new_size - 1] = pos;
    }
    return index;
}

struct index *buildIndex(int *arr, size_t arr_size, int val)
{
    struct index *index = NULL, *tmp; 

    for(size_t pos = 0; pos < arr_size; pos++)
    {
        if(arr[pos] == val) 
        {
            tmp = addIndex(index, pos);
            if(tmp) index = tmp;
            else { /* error handling */ }
        }
    }
    return index;
}

推荐阅读