在c语言中获取数组切片的最快方法是什么?

在c语言中获取数组切片的最快方法是什么?,c,C,我想这样做: char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'}; char out[3]; out = ∈ 并且只获取前3个字符 但是我得到一个不兼容类型的错误out是一个数组,数组名不能是可修改的左值 数组在C中不可分配。out是一个数组名,不能修改。在C语言中没有直接的方法来获取数组的切片。您可以使用memcpy: memcpy(out, in, sizeof out); 您需要在中使用足够的元素

我想这样做:

char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'};

char out[3];

out = ∈
并且只获取前3个字符


但是我得到一个不兼容类型的错误

out
是一个数组,数组名不能是可修改的左值


数组在C中不可分配。

out
是一个数组名,不能修改。在C语言中没有直接的方法来获取数组的切片。您可以使用
memcpy

memcpy(out, in, sizeof out);

您需要在中使用足够的元素进行复制。

由于数组不是为包含字符串而设计的,因此相应的代码可以如下所示

#include <stdio.h>

int main() 
{
    char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'};
    size_t n = sizeof( in );
    char out[3];

    memcpy( out, in, sizeof( out ) );
    n -= sizeof( out );
    memmove( in, in + sizeof( out ), n );

    printf( "%*.*s\n", n, n, in );
    printf( "%*.*s\n", sizeof( out ), sizeof( out ), out );

    return 0;
}
考虑到您必须在中跟踪数组的实际长度

另一个例子

#include <stdio.h>

int main() 
{
    char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'};
    size_t n = sizeof( in );
    char out[3];

    printf( "%*.*s\n\n", n, n, in );

    while ( !( n < 3 ) )
    {
        memcpy( out, in, sizeof( out ) );
        n -= sizeof( out );
        memmove( in, in + sizeof( out ), n );

        printf( "%*.*s\n", sizeof( out ), sizeof( out ), out );
    }

    return 0;
}

我将提出三种方法:

strncpy(out、in、sizeof out)

memcpy(out、in、sizeof out)

sscanf(输入,“%3s”,输出)

此外,您还应该将
设置为静态或全局,或者使用
malloc
在堆中分配它。只是为了确保前三个字符之外的任何内容都不会被复制到它

// global
char out[3];
int main() {...


选择哪一个取决于你。

使用指针或复制你想要的切片;数组不能分配给。@AndrejsCainikovs这在很多方面都是错误的
printf
接收一个
char*
,而不是
char
,它甚至不应该编译。@MarkSegal:是的,我犯了一个愚蠢的错误,没有打印一个字符。但请指出我错的地方。请注意,
中的
不是字符串:它没有零值元素。@andrejs我假设您尝试从偏移量2打印,而不是仅打印一个字符。
abcdfrtbhjli

abc
dfr
tbh
jli
// global
char out[3];
int main() {...
// static
static char out[3];
// heap
char *out = (char*) malloc(sizeof(char) * 3);
free(out);