我想要做类似于这样的事情:
char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'};
char out[3];
out = ∈
只获取前3个字符
但是我遇到了不兼容类型的错误
char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'};
char out[3];
out = ∈
只获取前3个字符
但是我遇到了不兼容类型的错误
out
是一个数组名称,无法被修改。在C语言中,没有直接获取数组切片的方法。可以使用memcpy
:
memcpy(out, in, sizeof out);
您需要确保in
中有足够的元素可以复制。
#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
out
是一个数组,数组名不能作为可修改的左值。
C语言中数组不可赋值。
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);
由你来决定选择哪个。
printf
接收的是char *
而不是char
,它甚至不应该编译。 - Mark Segalin
不是字符串:它没有零值元素。 - pmg