繁体   English   中英

C-复制字符串数组

[英]C - Copying array of strings

我的指针有问题。 我正在尝试将数组“名称”的内容复制到数组“ self.names”。 在循环中,当我打印指针的值时,指针指向第一个元素,但是当我将其作为参数传递给strcpy时,它指向第三个元素。 我做错了什么?

Argument.h:

#ifndef ARGUMENT_H
#define ARGUMENT_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Argument{
    char **names;
};
struct Argument Argument_new(char**);

#endif

Argument.c:

#include "argument.h"

struct Argument Argument_new(char **names){
    struct Argument self;
    size_t namesc=0;
    char **names_start=names;
    while(*names++){
        namesc++;
    }
    self.names=malloc(namesc*8);
    for(names=names_start;*names;names++){
        printf("%s\n",*names);
        *self.names=malloc(sizeof(*names));
        strcpy(*self.names,*names);
    }
    names=names_start;
    printf("%s\n%s\n",self.names[0],names[0]);
    printf("%s\n%s\n",self.names[1],names[1]);
}

main.c中:

#include "argparse/argparse.h"

int main(int argc, const char **argv){
    char *a[]={"abc","def","ghi",NULL};
    Argument_new(a);
    return 0;
}

在循环的每次迭代中,您都将当前字符串复制到*self.names ,即self.names[0] ,即列表中的第一个元素。 因此,当您打印self.names[0]只有您复制的最后一个内容出现在这里,即names列表中的最后一个字符串。

您需要跟踪使用的名称,然后将其复制到相关的数组成员中。

同样, sizeof(*names)给出char *的大小,而不是它包含的字符串的长度。 您需要为此感到strlen ,并确保在结尾的空字节处添加1。 同样,在分配列表时,不要使用幻数8,而要使用sizeof(*names)

int i;
self.names=malloc(namesc*sizeof(*names));
for(i=0,names=names_start;*names;names++,i++){
    printf("%s\n",*names);
    self.names[i]=malloc(strlen(*names) + 1);
    strcpy(self.names[i],*names);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM