0

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

4

1 回答 1

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]

对于真正的问题。我不确定你的方法对我来说是什么预期的。

于 2013-11-15T02:49:36.880 回答