指针类型错误不兼容

时间:2010-10-25 02:16:53

标签: c pointers arguments

嘿大家, 我的代码中出现编译错误,我无法弄清楚该怎么做。 这是块:

#include <stdio.h>
#include <string.h>    
/*
 * Function to return index at which team ID input is stored
 */
int getIndex(char* id, char* idList[][50]) {
    int k;
    for (k=0; k<50; k++) {
        if (strcmp(id,idList[k])==0) {
            return k;
        }
    }
    printf("Error in getIndex function.\n");
    return -1;
}

错误说

Passing argument 2 of 'strcmp' from incompatible pointer type

错误发生在块的第8行代码中(if语句)。

修改 (这里代表Michael发布,因为他还不能编辑他的帖子)

我会说明我想做什么,因为我没有真正做好这件事。

我想要id [],它应该是一个最多50个字符的数组,与idList [] []进行比较,这是一个字符串数组(最多50个字符串,最多50个字符)。

我将代码更改为

/*
 * Function to return index at which team ID input is stored
 */
int getIndex(char* id[], char* idList[][50]) {
    int k;
    for (k=0; k<50; k++) {
        if (strcmp(id[],idList[k][])==0) {
            return k;
        }
    }
    printf("Error in getIndex function.\n");
    return -1;
}

但是有一个错误说:

Expected expression ']' before token

3 个答案:

答案 0 :(得分:4)

表达式idList[k]char* [50]对象,而不是char*对象。您可能打算签名char idList[][50]char* idList[50],或者您可能打算提供第二个索引(如idList[k][j]中所示)。这就是错误信息的含义。显然,你最了解这个功能,所以你最能确切地知道你的选择中的哪一个。

修改
根据这些更新的信息,您可能需要的是:

int getIndex(const char* id, const char* id_list[], int id_list_length) {
    for (int i = 0; i < id_list_length; i++) {
        if (!strcmp(id, id_list[i])) {
            return i;
        }
    }
    printf("Error in getIndex function; ID \"%s\" not found.\n", id);
    return -1;
}

首先,请注意我使用的是const char*而不是char*。这是一个改进,它告诉编译器不会修改字符串的内容。其次,列表的大小在参数中给出,而不是硬编码到函数签名中。最后,在签名中使用括号(即[])的次数要少得多(通常,在C和C ++中,通常更常见的是在签名中看到指针,特别是考虑到数组实际上只不过是指针重复数据)。您可以在创建数组的位置强制执行长度要求,但通常更常见的是允许长度是动态的并自动计算。以下是一个使用示例:

const char* id_list[] = { "Alpha", "Bravo", "Charlie" };
int id_list_length = 3;
int zero = getIndex("Alpha", id_list, id_list_length);
int one = getIndex("Bravo", id_list, id_list_length);
int two = getIndex("Charlie", id_list, id_list_length);
int negative_one = getIndex("Not in there", id_list, id_list_length);

您也可以考虑将其修改为使用NULL作为列表的终止字符:

int getIndex(const char* id, const char* null_terminated_id_list[]) {
    for (int i = 0; null_terminated_id_list[i] != NULL; i++) {
        if (!strcmp(id, null_terminated_id_list[i])) {
            return i;
        }
    }
    printf("Error in getIndex function; ID \"%s\" not found.\n", id);
    return -1;
}

然后你甚至不需要记录列表的长度,你可以这样写:

const char* id_list[] = { "Alpha", "Bravo", "Charlie", NULL };
int zero = getIndex("Alpha", id_list);
int one = getIndex("Bravo", id_list);
int two = getIndex("Charlie", id_list);
int negative_one = getIndex("Not in there", id_list);

答案 1 :(得分:0)

在VS中,我收到此错误:

  

错误C2664:'strcmp':无法将参数2从'char * [50]'转换为'const char *'

问题是idList[k]是一个指针数组,而不是一个字符数组。

在C中,字符串可以是char*char[],但不是char*[]char*[]是一个字符串数组,这意味着char*[][](这是你的函数当前所用的)是一个字符串数组数组......

您需要更改功能签名(类似char idList[][50]char* idList[50]),或以某种方式添加第二个索引(类似idList[k][j])以匹配签名正确。

你有一个字符串数组,还是一个字符串数组?

  • 如果您有一个字符串数组,请修复函数签名:char* idList[50]
  • 如果你有一个字符串数组,你需要更改函数的主体,也许是签名,以传递每个内部数组的大小:

第二个选项的示例代码......

int getIndex(char* id, char* idList[][50], size_t idListSizes[50]) {
  int k, l;
  for (k=0; k<50; k++) {
    for (l=0; l<idListSizes[k]; l++) {
      if (strcmp(id,idList[k][l])==0) {
        /* somehow return both k and l */

修改

看到你的编辑(你发布的问题的答案:)),这就是你想要的:

int getIndex(char id[50], char idList[50][50]) {
  int k;
  for (k=0; k<50; k++) {
    if (strcmp(id,idList[k])==0) {
      return k;
    }
  }
  printf("Error in getIndex function.\n");
  return -1;
}

这里的关键是您不必使用char*来表示字符串。 char[]是一回事。

另请注意,在某些情况下,C不会强制执行此大小。使用我刚发布的代码,这仍将编译:

char blah[70];
char blee[14][50];
return getIndex(blah, blee);

虽然这不会:

char blah[70];
char blee[14][27];
return getIndex(blah, blee);

修改

最后一件事,你需要你的字符串大小为51,因为终止为null。例如:

char test[] = "test"; /* This is actually an array of size 5, not 4 */
char alt[] = { 't', 'e', 's', 't', '\0' }; /* same content as test... */

答案 2 :(得分:0)

如果您的idList参数应该表示ID的线性数组,那么它应该声明为char idList[][50]char *idList[],具体取决于数组本身是否实际提供了字符串内存(前者)或字符串内存分配在别处(后者)。很可能你需要前一种变体。

你现在拥有的东西 - char *idList[][50]看起来像是两者中奇怪的混合体,在你的意图背景下,我理解它的方式毫无意义。