是什么,“传递'strstr'的参数2使得指针来自整数而没有强制转换,”在C中表示

时间:2012-10-04 12:28:06

标签: c arguments

我正在尝试列出一些奶酪列表,您可以搜索到这些奶酪以获取某个奶酪。当我完成后,我还想添加每个信息。但每次我运行我的代码时,我都会收到标题中显示的错误。这是我的代码:

#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 个答案:

答案 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()