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

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

最佳答案

首先,这段代码:

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]

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

关于c - 在C中打印不均匀(非二次)矩阵的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985258/

相关文章:

c++ - 圈到圈交点

python - NumPy C API 扩展导致内存使用过多

c - Arduino 数字输入导致输出问题

c++ - 如何在C++中比较两个结构字符串

c++ - 为什么 string::data() 不提供可变字符 *?

c - C 中字符和字符串函数的二维数组

c - 如何在不使用 <string.h> 的情况下将字符串与子字符串进行比较以将第一个和第二个之间的相等部分转换为 '*'

c - C 编程的嵌套循环

c - 字符数组有问题?

linux - 为什么 Linux 内核使用 kobj->name[0] 来确定一个 NULL c 字符串?