我的任务目标(仅限C,无C#,CPP等......)是从用户获取字符串,然后修剪矩阵以适合确切的数据。这是我的代码:
void main(){
char** text=Q1();
int i;
printf("Lines entered:\n");
for(i=0;i<sizeof(text)/sizeof(char*);i++)
printf("%s\n",text[i]);
}
char** Q1(){
char OOM[]="Out of memory! exiting.";
char **buf=(char**)calloc(BUFFER,sizeof(char*)),**text;
int i,j;
if(buf==NULL){
printf(OOM);
exit(0);
}
for(i=0;i<BUFFER;i++){
buf[i]=(char*)calloc(BUFFER,sizeof(char));
if(buf[i]==NULL){
printf(OOM);
exit(0);
}
}
i=0;
do{
i++;
printf("Enter string #%d:\n",i);
gets(buf[i-1]);
}while(strlen(buf[i-1])>0 && i-1<BUFFER);
text=(char**)calloc(i,sizeof(char*));
if(text==NULL){
printf(OOM);
exit(0);
}
for(j=0;j<i;j++){
text[j]=(char*)calloc(strlen(buf[j]),sizeof(char));
if(text[j]==NULL){
printf(OOM);
exit(0);
}
strcpy(text[j],buf[j]);
}
free(buf);
return text;
}
现在我知道这可以用realloc完成(我还不太熟悉)。 我想测试我的分配是否正常,并打印我保存在文本中的字符串。 这种方式最直观的方法是什么? 提前谢谢!
答案 0 :(得分:0)
首先,这段代码:
for(i=0;i<sizeof(text)/sizeof(char*);i++)
printf("%s\n",text[i]);
不行。
由于sizeof(text)
是text
,char**
将返回指针的大小。你想要的东西是:
for (int i=0; i<BUFFER && text[i]!=0; i++)
printf("%s\n",text[i]);
但这要求文本中的最后一个条目是空指针,因此您需要再分配1个条目,并将其设置为NULL。
否则,您需要找到其他方法来返回大小。
下一步:
i=0;
do{
i++;
printf("Enter string #%d:\n",i);
gets(buf[i-1]);
}while(strlen(buf[i-1])>0 && i-1<BUFFER);
i
将比条目数多1。例如,如果用户在第一次尝试时按下ENTER,则i
将设置为1。
为什么不呢?
for (i=0; i<BUFFER; i++) {
printf("Enter string #%d:\n",i+1);
gets(buf[i]);
if (strlen(buf[i])==0) {
break;
}
}
这种方式i
设置为条目数。
假设您进行了上述更改:
text=(char**)calloc(i,sizeof(char*));
需要更改为:
text=(char**)calloc(i+1,sizeof(char*)); // Include an extra entry for the sentinel
text[i] = 0; // Add sentinel to indicate last entry
此外,为字符串分配空间时,需要在大小上加1,以便为终止空字符留出空间。所以
text[j]=(char*)calloc(strlen(buf[j]),sizeof(char));
变为
text[j]=(char*)calloc(strlen(buf[j])+1,sizeof(char));
你忘了将buf [0]释放到buf [BUFFER-1]
真正的问题。我不确定你的方法对我来说是否合适。