【问题标题】:Copying a subset of an array into another array / array slicing in C将数组的子集复制到另一个数组/数组切片中
【发布时间】:2013-01-15 02:45:52
【问题描述】:

在C语言中,有没有内置的数组切片机制?

例如在 Matlab 中, A(1:4)

会产生 =

 1     1     1     1

如何在 C 中实现这一点?

我试着寻找,但我能找到的最接近的是:http://cboard.cprogramming.com/c-programming/95772-how-do-array-subsets.html

subsetArray = &bigArray[someIndex]

但这并不完全返回切片数组,而是指向切片数组的第一个元素的指针......

非常感谢

【问题讨论】:

  • 在 C 中,通常会返回指向数组第一个元素的指针,因为指针和数组的处理方式非常相似。阅读以下内容:c-faq.com/aryptr/index.html,尤其是 6.3 和 6.8

标签: c arrays subset slice


【解决方案1】:

感谢大家指出C中没有这样的内置机制。

我尝试使用@Afonso Tsukamoto 的建议,但我意识到我需要一个多维数组的解决方案。所以我最终编写了自己的函数。我会把它放在这里以防其他人正在寻找类似的答案:

void GetSlicedMultiArray4Col(int A[][4], int mrow, int mcol, int B[1][4], int sliced_mrow)
{
    int row, col;
    sliced_mrow = sliced_mrow - 1; //cause in C, index starts from 0
    for(row=0; row < mrow; row++)
    {
        for (col=0; col < mcol; col++)
        {
            if (row==sliced_mrow) B[0][col]=A[row][col];
        }
    }
}

所以 A 是我的输入(原始数组),B 是我的输出(切片数组)。 我这样调用函数:

GetSlicedMultiArray4Col(A, A_rows, A_cols, B, target_row);

例如:

int A[][4] = {{1,2,3,4},{1,1,1,1},{3,3,3,3}};
int A_rows = 3; 
int A_cols = 4; 
int B[1][4]; //my subset
int target_row = 1;

GetSlicedMultiArray4Col(A, A_rows, A_cols, B, target_row);

这将产生一个结果(多维数组 B[1][4]),在 Matlab 中等于 A(target_row,1:4) 的结果。

我是 C 新手,所以如果我错了或者这段代码可以做得更好,请纠正我...再次感谢 :)

【讨论】:

    【解决方案2】:

    据我所知,在 C 中,数组名只是被视为一个 const 指针。所以你永远不知道子集的大小。您还可以将数组分配给新地址。因此,您可以简单地使用指针。但是您应该自己管理子集的大小。

    【讨论】:

      【解决方案3】:

      在标准 C 中这样做是不可能的。你必须自己做。 如果你有一个字符串,你可以使用 string.h 库来处理它,但是对于整数,我不知道有什么库。 除此之外,在拥有你所拥有的东西之后,你想要从哪里开始你的子集,实际上很容易实现。

      假设你知道你的“主”数组的大小并且是一个整数数组,你可以这样做:

      subset = malloc((arraySize-i)*sizeof(int)); //Where i is the place you want to start your subset. 
      
      for(j=i;j<arraySize;j++)
         subset[j] = originalArray[j];
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2022-11-30
        • 2017-09-13
        • 1970-01-01
        • 2022-07-05
        • 2012-09-17
        • 2011-05-08
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        相关资源
        最近更新 更多