期望’const char *’但参数在C中的类型为’char **’
我正在尝试编写一个搜索数组查找指定键的函数。参数n指定数组的有效大小,必须根据strcmp强加的字典顺序进行排序。如果找到键,则函数返回数组中出现该键的索引。因此,它可以返回子字符串的索引。但是,它出现了两个我无法解决的错误。请帮忙。
jiebin@jiebin-ThinkPad-Edge-E530:~/Program_C/programming_abstractions_in_c/FindStringInSortedArray$ gcc FindStringInSortedArray.c -o FindStringInSortedArray FindStringInSortedArray.c: In function 'FindStringInSortedArray': FindStringInSortedArray.c:7:3: warning: passing argument 1 of 'strlen' from incompatible pointer type [enabled by default] /usr/include/string.h:399:15: note: expected 'const char *' but argument is of type 'char **' jiebin@jiebin-ThinkPad-Edge-E530:~/Program_C/programming_abstractions_in_c/FindStringInSortedArray$
这是我的代码:
#include #include int FindStringInSortedArray(char *key,char *array[],int n) { int mid,cmp; int low=strlen(array)-n; int high=n; if(low > high) return(-1); mid = (low+high)/2; cmp = strcmp(key,array[mid]); if(cmp==0) return(mid); if(cmp<0){ return(FindStringInSortedArray(key,array,n/2)); }else{ return(FindStringInSortedArray(key,array+n/2,n)); } } int main() { char key[2]="ab"; char *array[10]={"ab","bc","cd","de","ef","fg","gh","hi","ij","jk"}; int test=FindStringInSortedArray(key,array,10); printf("Result:%d\n",test); return 0; }
int low=strlen(array)-n;
是错的。 将数组大小作为不同的参数传递,如:
int FindStringInSortedArray(char *key,char *array[],int n, int arraysize)
因为数组在函数中衰减成指针。 strlen声明的forms
strlen (const char*)
你正在传递*array[]
其类型衰减为char * *
。
在C99中,有三种基本情况,其中数组名称不会衰减为指向第一个元素的指针:
-
当它是
&
(地址)运算符的参数时。 -
当它是
sizeof
运算符的参数时。 -
当它是
char [N + 1]
类型的字符串文字或类型为wchar_t [N + 1]
的宽字符串文字(N
是字符串的长度)时,它用于初始化数组,如char str[] = "foo";
或者wchar_t wstr[] = L"foo";
。
在C11中,新引入的alignof
运算符也不允许其数组参数衰减为指针。
当你调用strlen
,它期望一个char*
(即一个字符串)作为参数,但你提供的是一个char**
(即一个字符串数组)的数组。
你想要的是arrays的大小,我想。 在C中无法知道它。唯一的方法是将数组的大小作为参数传递:
int FindStringInSortedArray(char *key,char *array[],int n, int len)