#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
答案 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]
看起来像是两者中奇怪的混合体,在你的意图背景下,我理解它的方式毫无意义。