在c中打印未知的2D数组

时间:2016-03-16 10:01:50

标签: c arrays

我是stackoverflow的新手。

我有一个像这样的未知大小的字符串的二维数组。

   char **table = NULL;
   table = myfunc();   // Table now contains something like {"Merry","Leo","Linus"...} 

有没有办法用这样的循环打印这个数组?

   int i = 0;
   while(????){   // Is there a condition i can use here to loop the list? 
        printf("%s", table[i]);
        i++;
   }

所以我得到了下面的输出。

Merry
Leo
Linus

提前致谢。

3 个答案:

答案 0 :(得分:3)

其他选择:

  1. 将变量的地址传递给函数,并将其设置为函数中数组中的元素数:

    int

    然后,条件可能是:

    char **table = NULL;
    size_t n;
    table = myfunc(&n);
    
  2. 使用一些特殊值标记数组的结尾,例如while(i < n) { … }

    NULL

    然后,条件可能是:

    char **table = NULL;
    table = myfunc(); // Table now contains something like {"Merry","Leo","Linus", …, NULL}
    
  3. 注意:在这两种选择中,请勿忘记while(table[i]) { … } i

答案 1 :(得分:0)

你可以使用哨兵。修改您的myfunc以在最后一个元素后添加NULL。您的数组看起来像{"Merry", "Leo", ...., NULL}

现在,你可以这样迭代:

int i = 0;

while (table[i] != NULL)
{
    printf("%s", table[i]);
    i++;
}

小心,使用基于哨兵的解决方案,你会遇到一些麻烦,比如字符串:你确定哨兵是否正确设置,数据源是否安全?如果没有,我建议您添加限制:while(i < MAX && table[i] != NULL)

答案 2 :(得分:0)

您可以在函数main中使用C标准使用的模型。

主要的标准声明是

int main( int argc, char * argv[] )
{
   //...
}

argv[argc]始终等于NULL。使用此事实,您可以通过以下方式输出主要的所有参数

#include <stdio.h>

int main( int argc, char * argv[] )
{
    while ( *argv ) puts( *argv++ );
}

所以你的程序需要的是字符串数组的最后一个元素等于NULL

在这种情况下,你可以写

   char **table = NULL;
   table = myfunc();

   for ( char **p = table; *p; ++p ) puts( *p );

另一种方法是编写函数,使其报告数组中元素的数量。在这种情况下,函数可以声明为

size_t myFunc( char ***table );

或喜欢

char ** myFunc( size_t *n );

并调用

size_t n = myFunc( &table );

size_t n;

table = myFunc( &n );