我正在尝试列出一些奶酪列表,您可以搜索到这些奶酪以获取某个奶酪。当我完成后,我还想添加每个信息。但每次我运行我的代码时,我都会收到标题中显示的错误。这是我的代码:
#include<stdio.h>
#include<string.h>
int main()
{
char cheeses[][20] = {
"Cheddar",
"White Cheddar",
"Colby Jack",
"Gouda",
"Blue Cheese",
"Gorgonzola",
"Asiago",
"Limburger",
"Feta",
"Brie",
};
void find_cheese(char search_for)
{
int i;
for (i = 0; i < 5; i++) {
if (strstr(cheeses[i], search_for))
printf("Cheese %i: '%s'\n", i, cheeses[i]);
}
}
int main()
{
char search_for[20];
printf("Search for: ");
fgets(search_for, 20, stdin);
find_cheese(search_for);
return 0;
}
}
为什么会这样?我在书中查了一下,但似乎无法找到答案。
答案 0 :(得分:2)
strstr的第二个参数应为const char*
。您传递了一个char
。
答案 1 :(得分:2)
strstr
期望指向char
的指针作为第二个参数:
const char * strstr ( const char * str1, const char * str2 );
当你传递char
时。
答案 2 :(得分:0)
void find_cheese(char search_for)
应该是
void find_cheese(char *search_for)
因为它正在寻找一个字符串(char *
),而不是一个字符。
答案 3 :(得分:0)
strstr()
将字符串(char *)作为第二个参数。
有关用法,请参阅here。
您的代码中的问题是您接受错误传递的数组:
void find_cheese(char search_for) //This line is wrong
{
你想做的是:
void find_cheese(char search_for[])
修改强>
这是正在发生的事情。在主函数中访问数组时:
find_cheese(search_for);
你在这里做的是传递一个地址。 (当您只是访问数组search_for
时,您将获得一个地址)。因此,当你的原型说它采用char
时,编译器会看到地址(4个字节,看起来像一个int)并截断它以适合一个字节的char。
防止这种情况的方法是传递整个“字符串”(C中的字符串是一个字符数组)。所以你可以通过将search_for
作为数组或作为指针(地址到字符数组)传递来实现。
void find_cheese(char search_for[])
和
void find_cheese(char *search_for)
两者是否有效并且相当于您的需求(传递给strstr()
)