我知道这段代码很草率,我正在尝试重新学习C语言中的字符串操作。如果我有一个字符串ABBCCCD
,并且我想将单独的字母存储在结构中,是否有一种有效的方法所以?我下面有一些代码来演示我要尝试的工作的长途旅行。 (此外,我在执行strncpy
时是否必须手动添加空终止符?)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct dst_struct {
char a[2];
char b[3];
char c[4];
char d[2];
} dst_struct_t;
int main(void) {
char* test = "ABBCCCD";
char* src = malloc(strlen(test)+1);
strncpy(src, test, strlen(test)+1);
printf("%s\n", src);
dst_struct_t dst;
strncpy(dst.a, src, 1);
strncpy(dst.b, src+1, 2);
strncpy(dst.c, src+3, 3);
strncpy(dst.d, src+6, 1);
printf("dst.a: %s\n", dst.a);
printf("dst.b: %s\n", dst.b);
printf("dst.c: %s\n", dst.c);
printf("dst.d: %s\n", dst.d);
free(src);
}
答案 0 :(得分:2)
除了您不需要先将test
复制到src
之外,实际上没有更好的方法。
您还需要向所有字符串添加空终止符。最好编写一个同时执行两个步骤的函数:strncpy()
并添加空终止符。
function copy_n(char *dest, char *src, size_t offset, size_t len) {
strncpy(src+offset, dest, len);
dest[len] = '\0';
}
int main(void) {
char* test = "ABBCCCD";
copy_n(dst.a, test, 0, 1);
copy_n(dst.b, test, 1, 2);
copy_n(dst.c, test, 3, 3);
copy_n(dst.d, test, 6, 1);
printf("dst.a: %s\n", dst.a);
printf("dst.b: %s\n", dst.b);
printf("dst.c: %s\n", dst.c);
printf("dst.d: %s\n", dst.d);
}
答案 1 :(得分:0)
在strcpy
/ strncpy
手册页中:
char * strcpy(char * dest,const char * src);
char * strncpy(char * dest,const char * src,size_t n);
strcpy()函数将src指向的字符串(包括终止空字节('\ 0'))复制到dest指向的缓冲区。字符串不能重叠,并且目标字符串dest必须足够大才能接收副本。当心缓冲区溢出! (请参阅错误。)
strncpy()函数类似于,但最多复制了src个n字节。 警告:如果src的前n个字节中没有空字节,则放置在dest中的字符串将不会以空值结尾。
n
的{{1}}参数通常是目标缓冲区的长度,因为该函数的要点类似于strncpy
,但如果出现以下情况,则可以防止目标缓冲区溢出源字符串太长或未以NULL终止。如果以这种方式使用,则如果源字符串适合该长度,则目标字符串将以NULL终止,否则缓冲区的最后一个字节将包含源字符串的第strcpy
个字符。
但是,您似乎使用n
的方式是设置要从源缓冲区复制到目标缓冲区的确切字符数。这实际上不是strncpy
的预期目的。相反,您要使用的是strncpy
,因为您实际上并不关心源字符串的零终止,而只是从设置的位置复制一定数量的字符。是的,如果您使用memcpy
,则必须手动添加空终止符。