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

3
我想要做类似于这样的事情:
char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'};

char out[3];

out = ∈

只获取前3个字符

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


使用指针或复制所需的切片;不能将数组分配给。 - cadaniluk
1
@AndrejsCainikovs 这样做是错误的,有很多方面都是。printf接收的是char *而不是char,它甚至不应该编译。 - Mark Segal
@MarkSegal:https://ideone.com/FyMERy 是的,我犯了一个愚蠢的错误,没有打印一个字符。但请指出我错的所有地方。 - Andrejs Cainikovs
请注意,in 不是字符串:它没有零值元素。 - pmg
@andrejs 我假设你尝试从偏移量2开始打印,而不仅仅是单个字符。 - Mark Segal
4个回答

8

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

memcpy(out, in, sizeof out);

您需要确保in中有足够的元素可以复制。


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

3

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

C语言中数组不可赋值。


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);

由你来决定选择哪个。


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