2010-10-25 167 views
0

嘿大家, 我在我的代码中收到编译错误,我不知道该怎么办。 这里是块:不兼容的指针类型错误

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

和错误上说在一个代码块8号线(if语句)发生

Passing argument 2 of 'strcmp' from incompatible pointer type 

错误。

编辑 (贴在这里代表迈克尔,因为他不能编辑自己的帖子还)

我指定我想做的事,因为我并没有真正做好在那。

我想要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 

回答

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); 
+0

我试图用idList [k] [](我不确定k是否在右括号中)比较id [](我省略了代码中的括号)。我想比较'字符串'id和idList中的所有'字符串'(每个字符包含50个字符的50个字符串)。 – Michael 2010-10-25 02:26:20

+0

@Michael:如果idList是50个字符串的列表,那么它可以被声明为'char * idList [50]',同时铭记编译器不会强制它真的是50.你声明'idList '作为'char *'的二维数组,但似乎你想要一个'char *'的数组。 – 2010-10-25 02:35:29

0

在VS,我得到这个错误:

error C2664: 'strcmp' : cannot convert parameter 2 from 'char *[50]' to 'const char *'

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

在C中,字符串是char*char[],但不是char*[]。 A 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 */ 

EDIT

看到您的编辑(您发布作为一个回答你的问题:))之后,这是你想要什么:

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*来代表一个字符串。 A 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... */ 
0

如果idList参数应该代表ID的线性阵列,那么它应该被声明为char idList[][50]char *idList[],取决于阵列本身是否实际提供的串存储器(前者)或者字符串内存被分配到其他地方(后者)。很可能你需要以前的变种。

你现在有什么 - char *idList[][50]看起来像是一个奇怪的混合体,在你的意图和理解的方式中没有任何意义。