期望'const char *'但参数在C中的类型为'char **'

时间:2013-11-26 09:30:13

标签: c arrays pointers

我正在尝试编写一个搜索数组的函数来查找指定的键。参数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<stdio.h>
#include<string.h>

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;
}

2 个答案:

答案 0 :(得分:8)

int low=strlen(array)-n;错了。将数组大小作为不同的参数传递,如:

int FindStringInSortedArray(char *key,char *array[],int n, int arraysize)

因为数组在函数中衰减为指针。 strlen声明的形式为

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";

  4. 在C11中,新引入的alignof运算符不允许其数组参数衰减为指针。

答案 1 :(得分:2)

当您致电strlen时,它会期望char*(即字符串)作为参数,但您提供的arraychar**(即一串字符串)。

我猜你想要的是数组的大小。在C.中无法知道它。唯一的方法是将数组的大小作为参数传递:

int FindStringInSortedArray(char *key,char *array[],int n, int len)