哪个是在c中获取数组切片的最快方法?

时间:2015-05-15 10:55:58

标签: c

我想做这样的事情:

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

char out[3];

out = ∈

并且只获得前3个字符

但是我收到了不兼容类型的错误

4 个答案:

答案 0 :(得分:8)

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

memcpy(out, in, sizeof out);

你需要认为in有足够的元素来复制。

答案 1 :(得分:4)

由于您的数组不是为包含字符串而设计的,因此相应的代码可以采用以下方式

#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;
}

程序输出

dfrtbhjli
abc

考虑到你必须追踪数组的实际长度。

另一个例子

#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;
}

程序输出

abcdfrtbhjli

abc
dfr
tbh
jli

答案 2 :(得分:3)

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

数组不能在C中分配。

答案 3 :(得分:1)

我会建议三种方式:

strncpy(out, in, sizeof out)

memcpy(out, in, sizeof out)

sscanf(in, "%3s", out)

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

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

// static
static char out[3];

// heap
char *out = (char*) malloc(sizeof(char) * 3);
free(out);

由您自己选择。