我有一个输入函数,如:
int func(char* s[])
{
// return number of rows in the character array s
}
其中char数组是随机提供的,例如:{“sdadd”,“dsdsd”,“dsffsf”,“ffsffsf”}。
以上示例输出应为4。
答案 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/)。
在这种情况下,你有两种可能性。
使用结束标记。如果数组的元素类型可以包含一个不会发生的特殊值,那么它总是有效的。#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;
}
传递数组的长度信息。有趣的是,这是argc中C运行时传递给main()
的信息。
除此之外,没有(或至少没有便携式)方式知道数组有多少元素作为参数传递给C中的函数。
答案 2 :(得分:-1)
int size = sizeof(s)/sizeof(s[0]);
这个陈述会做。将为变量大小分配*s[]
中存在的字符串数。