2016-12-06 98 views
0

我有一個複製一個char **到另一個字符**(C)

char **content; 

包含文本行,爲了改變一些行我創建了一個

char **temp; 

和複製(與strncpy)無論我需要從contenttemp。 所以當它沒關係我有一個char **content有舊的內容,char **temp有新的內容,我想用temp取代我的char **content

我嘗試了天真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 
+0

請顯示[MCVE]。順便說一句:通常如果你需要'***'你的方法有問題。 –

+0

添加的代碼和我有的輸出 – Vertus

+0

你的代碼中有另一個問題:'print'打印行直到它遇到一個'NULL'指針,但是你不在'main中向數組中添加'NULL'指針'也不在'addline'中。所以你的代碼恰好或多或少地工作,因爲顯然在你的平臺上'malloc'用零填充分配的內存。在我的電腦上,我遇到了一個崩潰。 –

回答

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被稱爲如下:

    addline(char ***content, etc);  // prototype 
    swappointers(content,&tempcontent); // call in addline 
    addline(&content,"line 1",1);  // call in main 
    
  3. swappointers後必須釋放tempcontent

+0

我使用malloc(line_length)而不是line_length + 1,但我仍然將最後一個字符設置爲\ 0,您怎麼看待我添加的代碼? – Vertus

+0

請參閱編輯我的解決方案 –

+0

有問題,... 我最終得到我想要通過使addline返回一個char **和main:content = addline();但不知道如何在這裏管理內存 – Vertus

相關問題