如何将数据从字符串复制到struct中的字段

时间:2018-08-27 16:50:09

标签: c string struct

我知道这段代码很草率,我正在尝试重新学习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);


}

2 个答案:

答案 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,则必须手动添加空终止符。