请看一下代码,clang给出了错误“不兼容的指针到整数转换传递'字符串'到参数类型'int'“

mfpqipee  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(68)
float x;
    for (int i = 0; i < NUM_ITEMS; i++)
    {
        if (strcmp(tolower(item), tolower(menu[i].item)) == 0)
        {
            x = menu[i].price;
            break;
        }
    }

字符串
我试图通过将item和menu[i].item都转换为来比较它们

li9yvcax

li9yvcax1#

在使用一个函数之前,请务必阅读函数说明。
函数tolower的声明方式如下

#include <ctype.h>
int tolower(int c);

字符串
正如你所看到的,它返回一个int类型的对象,并接受整数。但似乎你传递给函数的是字符串(作为字符数组或指针)。
所以编译器发出消息。
函数strcmp也声明为

#include <string.h>
int strcmp(const char *s1, const char *s2);


也就是说,它期望指向char的指针作为参数。
但是在这个if语句中,

if (strcmp(tolower(item), tolower(menu[i].item)) == 0)


不是将指向字符串的指针(指向它们的第一个字符)传递给函数strcmp,而是传递由函数tolower返回的整数。
看起来你需要自己写一个函数来比较两个字符串,其中的字符被转换为小写。

int str_tolower_cmp( const char *s1, const char *s2 )
{
    unsigned char c1 = tolower( ( unsigned char )*s1 );
    unsigned char c2 = tolower( ( unsigned char )*s2 );

    while ( c1 &&  c1 == c2 )
    {
        c1 = tolower( ( unsigned char )*++s1 );
        c2 = tolower( ( unsigned char )*++s2 );
    }

    return ( c2 < c1 ) - ( c1 < c2 );
}


然后

if ( str_tolower_cmp( item, menu[i].item ) == 0 )
//...


否则,如果名称为item的对象的类型为char,则只需写入

if ( tolower(( unsigned char )item) == tolower(( unsigned char )menu[i].item))


或者,如果变量item的类型为char,而menu[i].item表示一个字符串,那么可以这样写:

if ( tolower(( unsigned char )item) == tolower(( unsigned char )menu[i].item[0]))

相关问题