1

我正在尝试列出一份奶酪列表,您可以通过搜索找到某个奶酪。完成后,我还想添加有关每个人的信息。但是每次我运行我的代码时,我都会得到标题中显示的错误。这是我的代码:

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

为什么会这样?我在我的书里查过,但似乎找不到答案。

4

4 回答 4

2

strstr的第二个参数应该是const char*. 你正在传递一个单一的char.

于 2012-10-04T12:30:08.977 回答
2

strstr期望一个指针char作为第二个参数:

const char * strstr ( const char * str1, const char * str2 );

当你通过一个char.

于 2012-10-04T12:30:11.470 回答
0
void find_cheese(char search_for)

应该

void find_cheese(char *search_for)

因为它正在寻找一个字符串 ( char *),而不是单个字符。

于 2012-10-04T12:32:47.820 回答
0

strstr()将字符串 (char *) 作为第二个参数。用法见这里

您的代码中的问题是您错误地接受了传递的数组:

    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)并将其截断以适应一个字节的字符。

防止这种情况的方法是传递整个“字符串”(C 中的字符串是字符数组)。因此,您可以通过search_for作为数组或指针(字符数组的地址)传递来做到这一点。

void find_cheese(char search_for[])

void find_cheese(char *search_for)

既可以工作,又可以满足您的需求(传递给strstr()

于 2012-10-04T12:32:51.543 回答