我有一个输入功能,如:
int func(char* s[])
{
// return number of rows in the character array s
}
其中 char 数组 s 是随机提供的,例如:{“sdadd”、“dsdsd”、“dsffsf”、“ffsffsf”}。
对于上面的例子,这里的输出应该是 4。
我有一个输入功能,如:
int func(char* s[])
{
// return number of rows in the character array s
}
其中 char 数组 s 是随机提供的,例如:{“sdadd”、“dsdsd”、“dsffsf”、“ffsffsf”}。
对于上面的例子,这里的输出应该是 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(...)
)
与 C 中的所有数组参数一样,无法做到这一点,因为数组在传递时会衰减到指向其第一个元素的指针(有关讨论,请参见 C 常见问题解答,http://c-faq.com/aryptr/)作为函数参数。
在这种情况下,您有两种可能性。
使用结束标记。如果数组的元素类型可以保存一个不会“自然”出现的特殊值,那么这总是有效的。对于'\ 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;
}
使用数组传递长度信息。有趣的是,C 运行时也传递给 argc 中的信息main()
。
除此之外,没有(或至少没有可移植的)方法可以知道数组有多少元素,这些元素作为参数传递给 C 中的函数。
int size = sizeof(s)/sizeof(s[0]);
这个声明就行了。变量 size 将分配给*s[]
.