3

我有一个输入功能,如:

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

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

对于上面的例子,这里的输出应该是 4。

4

3 回答 3

4

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

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

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

因此,您的问题的答案是:根据给定的信息func() 无法确定 中的字符串数s

一个重要的区别可以为字符数组
确定 大小,例如

 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 

在 scope中,在这种情况下,仅仅意味着 char *s[]... 被定义为具有全局可见性,或者在计算元素数量的函数内。如果作为参数传递,如上定义的 char *s[]; 将被简单地视为 char *s,并且无法确定参数的数量。

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

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

于 2013-10-20T19:15:01.737 回答
2

与 C 中的所有数组参数一样,无法做到这一点,因为数组在传递时会衰减到指向其第一个元素的指针(有关讨论,请参见 C 常见问题解答,http://c-faq.com/aryptr/)作为函数参数。

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

  1. 使用结束标记。如果数组的元素类型可以保存一个不会“自然”出现的特殊值,那么这总是有效的。对于'\ 0'的字符,对于像你的数组中为NULL的指针,空指针。例如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. 使用数组传递长度信息。有趣的是,C 运行时也传递给 argc 中的信息main()

除此之外,没有(或至少没有可移植的)方法可以知道数组有多少元素,这些元素作为参数传递给 C 中的函数。

于 2015-04-20T11:36:22.460 回答
-1
int size = sizeof(s)/sizeof(s[0]);

这个声明就行了。变量 size 将分配给*s[].

于 2015-04-20T10:29:39.510 回答