我有一个
char **content;
包含文本行,为了更改某些行,我创建了一个
char **temp;
并从strncpy
到content
复制(使用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
答案 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);
<小时/> 编辑:
您添加了代码并要求我查看它。我有以下评论:
strncpy
之后总是在最后一个位置放置一个空字符! strncpy
不会为您执行此操作,并且使用malloc
分配的任何内存都不会初始化为零:
strncpy(content[0],"line 0",MAXLENGTH);
content[0][MAXLENGTH-1]= '\0';
要使addline
正常工作,即交换指针,您必须在content
中传递main
的地址,然后必须在addline
中调用swap如下:
addline(char ***content, etc); // prototype
swappointers(content,&tempcontent); // call in addline
addline(&content,"line 1",1); // call in main
swappointers
之后您必须免费tempcontent