如何在C中查找动态2D字符数组中的行数?

时间:2013-10-20 18:35:55

标签: c multidimensional-array arrays

我有一个输入函数,如:

int func(char* s[])
{
    // return number of rows in the character array s
}

其中char数组是随机提供的,例如:{“sdadd”,“dsdsd”,“dsffsf”,“ffsffsf”}。

以上示例输出应为4。

3 个答案:

答案 0 :(得分:4)

传递字符串数组需要更多信息......

这类似于调用int main(int argc, char *argv[])时的输入。例外情况是,当调用main()时,它会读取命令行并在argc中提供计数信息,以确定 argv[]中的参数数量。这就是可以传递char *argv[]参数的原因。

您有相同的要求。那是在传递诸如char *s[]之类的参数时,也就是说,你还必须以某种方式提供一个告诉func()多少字符串的值。 C无法在不被告知的情况下知道该变量中的字符串数量。这是因为数组引用(char * s [];)衰变为指向char(char * s;)的指针,指向该数组的第一个元素,即没有数组大小信息。

因此,您的问题的答案是: 包含func() 不能 确定s中的字符串数量。

重要区别
为字符数组确定 CAN 的大小,例如

 char *s[]={"this","is","an","array"};  // the assignment of values in {...}
                                        //make this an array of strings. 

但只有在尝试确定元素数量的函数的同一范围 中声明s时。如果满足该条件,则使用:

int size = sizeof(s)/sizeof(s[0]);  //only works for char arrays, not char *  
                                    //and only when declared and defined in scope of the call 

在范围 中,在此上下文中,仅表示char * s [] ...使用全局可见性定义,或者在函数内定义计算元素数量。如果作为参数传递,char * s [];,如上所定义,将被简单地视为char * s,并且无法确定参数的数量。

检索字符串数组中字符串计数的其他选项包括:
1) 修改输入数组,使最后一个字符串中的某些内容是唯一的,例如“%”或“\ 0”。这将允许您使用标准C字符串函数测试字符串。

2) 在提供字符串数量的函数中包含一个参数。 (例如,类似于main(...)printf(...)

答案 1 :(得分:2)

与C中的所有数组参数一样,没有办法做到这一点,因为当作为函数参数传递时,数组会衰减为指向其第一个元素的指针(对于讨论参见C FAQ,http://c-faq.com/aryptr/)。

在这种情况下,你有两种可能性。

  1. 使用结束标记。如果数组的元素类型可以包含一个不会发生的特殊值,那么它总是有效的。#34;自然地"对于那种类型。对于字符“#0”,对于像数组中指针那样的指针,空指针。例如argv[]main()的第二个参数由空指针终止。这使得迭代变得容易:

    #include<stdio.h>
    int main(int argc, char *argv[])
    {
        int i;
        for(i=0; argv[i] != NULL; i++)
        {
            printf("%s\n", argv[i]);
        }
        return 0;
    }
    
  2. 传递数组的长度信息。有趣的是,这是argc中C运行时传递给main()的信息。

  3. 除此之外,没有(或至少没有便携式)方式知道数组有多少元素作为参数传递给C中的函数。

答案 2 :(得分:-1)

int size = sizeof(s)/sizeof(s[0]);

这个陈述会做。将为变量大小分配*s[]中存在的字符串数。