将char **复制到另一个char **(C)

时间:2016-12-06 08:47:56

标签: c string pointers

我有一个

char **content;

包含文本行,为了更改某些行,我创建了一个

char **temp;

并从strncpycontent复制(使用temp)我需要的任何内容。 所以,如果没有问题,我的char **content包含旧内容,而char **temp包含新内容,我想将char **content替换为temp

我尝试了一个天真的content=temp;但当然没有结果......

我试图释放char **content然后content=temp;的每个元素,但没有任何改变,我也无法释放内容。

我试过

void swappointers(char ***content,char ***temp){
    char **t = *content;
    *content = *temp;
    *temp = t;
}
swappointers(&content,&temp);

没有成功。

如何交换它们?

编辑: 最小代码:

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

#define MAXLINES 7
#define MAXLENGTH 255


void print(char **content){
    int countline=0;
    while(content[countline]!=NULL){
        printf("%s\n",content[countline]);  
        countline++;
    }
}

void swappointers(char ***content,char ***tempcontent){
    char **temp = *content;
    *content = *tempcontent;
    *tempcontent = temp;
}

void addline(char **content,char *texttoadd,int linetoinsert){
    char **tempcontent=(char**)malloc(sizeof(char*)*MAXLINES);

    int countline=0;
    int contentline=0;
    while(content[contentline]!=NULL){
        if(countline==linetoinsert){
            //add our text
            tempcontent[countline] = malloc(MAXLENGTH);
            strncpy(tempcontent[countline],texttoadd,MAXLENGTH);

            //add \0 (string end character)
            int linelength=strlen(tempcontent[countline])-1;
            for (int countchar=linelength;countchar>=0;countchar--){
                if(tempcontent[countline][countchar]=='\r'||tempcontent[countline][countchar]=='\n'){
                    //end line char
                    tempcontent[countline][countchar+1]='\0';
                }
            }
        }
        else{
            //copy from content
            tempcontent[countline]=content[contentline];
            contentline++;
        }
        countline++;
    }
    tempcontent[countline]=NULL;
    printf("tempcontent:\n");
    print(tempcontent);
    swappointers(&content,&tempcontent);
}

int main(){
    //allocate memory for our future content
    char **content = (char**)malloc(sizeof(char*)*MAXLINES);

    content[0] = malloc(MAXLENGTH);
    strncpy(content[0],"line 0",MAXLENGTH);
    content[1] = malloc(MAXLENGTH);
    strncpy(content[1],"line 2",MAXLENGTH);
    content[2] = malloc(MAXLENGTH);
    strncpy(content[2],"line 3",MAXLENGTH);
    content[3] = NULL;

    printf("________FILE BEFORE________\n");
    print(content);

    addline(content,"line 1",1);

    printf("________FILE AFTER________\n");
    print(content);
}

输出:

________FILE BEFORE________
line 0
line 2
line 3
tempcontent:
line 0
line 1
line 2
line 3
________FILE AFTER________
line 0
line 2
line 3

1 个答案:

答案 0 :(得分:1)

如果char **content有“文本行”,则content指向一个数组,其中每个元素都有一个指向字符串的指针(文本行)。

假设你有10行。然后将content分配为:

content= malloc(10*sizeof(char *));

假设每行不超过80个字符,则将第一行分配为:

content[0]= malloc(80+1);  //add one for the terminating \0
strcpy(content[0], myline);

现在,从这个例子中,您可以弄清楚如何分配其他行,分配temp,将行复制到temp并执行您需要做的任何事情。

完成后,不要忘记释放内存:

free(content[0]); //...and free the other lines as well
free(content);

<小时/> 编辑:

您添加了代码并要求我查看它。我有以下评论:

  1. strncpy之后总是在最后一个位置放置一个空字符! strncpy不会为您执行此操作,并且使用malloc分配的任何内存都不会初始化为零:

    strncpy(content[0],"line 0",MAXLENGTH);
    content[0][MAXLENGTH-1]= '\0';
    
  2. 要使addline正常工作,即交换指针,您必须在content中传递main的地址,然后必须在addline中调用swap如下:

    addline(char ***content, etc);       // prototype
    swappointers(content,&tempcontent);  // call in addline
    addline(&content,"line 1",1);        // call in main
    
  3. swappointers之后您必须免费tempcontent