期望’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中,有三种基本情况,其中数组名称不会衰减为指向第一个元素的指针:

  1. 当它是& (地址)运算符的参数时。

  2. 当它是sizeof运算符的参数时。

  3. 当它是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)