在C语言中将一个数组的子集复制到另一个数组中 / 数组切片

17

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]

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

非常感谢。


1
在C语言中,通常会返回指向数组第一个元素的指针,因为指针和数组的处理方式非常相似。请阅读以下内容:http://c-faq.com/aryptr/index.html,特别是6.3和6.8。 - Timothy Jones
3个回答

11

在标准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];

希望这可以帮助到您。


9
感谢大家指出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语言中,数组名只被视为一个常量指针。因此,你无法确定其子集的大小。而且,你可以将数组分配给一个新地址。因此,你可以使用一个指针来代替。但是你需要自己管理子集的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接