在C中打印不均匀(非二次)矩阵的内容

时间:2013-11-14 18:17:18

标签: c c-strings

我的任务目标(仅限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完成(我还不太熟悉)。 我想测试我的分配是否正常,并打印我保存在文本中的字符串。 这种方式最直观的方法是什么? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

首先,这段代码:

for(i=0;i<sizeof(text)/sizeof(char*);i++)
  printf("%s\n",text[i]);

不行。 由于sizeof(text)textchar**将返回指针的大小。你想要的东西是:

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]

真正的问题。我不确定你的方法对我来说是否合适。