8

-Wcast-qual在 stristr() 的return行上输出此警告。问题是什么 ?

警告:cast 丢弃来自指针目标类型的限定符

char *stristr(const char *string, const char *substring)
{
size_t stringlength = strlen(string);
char *stringlowered = malloc(stringlength + 1);
strcpy(stringlowered, string);
tolower2(stringlowered); // in my source it has a different name, sorry.

char *substringlowered = malloc(strlen(substring) + 1);
strcpy(substringlowered, substring);
tolower2(substringlowered); // in my source it has a different name, sorry.

const char *returnvalue = strstr(stringlowered, substringlowered);
if(returnvalue != NULL)
{
    size_t returnvaluelength = strlen(returnvalue);
    returnvalue = string;
    returnvalue += stringlength - returnvaluelength;
}

free(stringlowered);
free(substringlowered);

return (char *)returnvalue;
}

编辑:
在 glibc 2.15 的 strstr() 源代码中:

return (char *) haystack_start; // cast to (char *) from const char *
4

3 回答 3

9

您已声明returnvalue为指向 a 的指针const char,但随后将其强制转换为指向非的指针const char。您已经丢弃了const限定符,所以编译器会抱怨您已经丢弃了它!

解决方案是要么改变函数的返回类型,要么找到一个非const char指向。您的函数中没有参数类型,因此如果您确实需要非const返回类型,可以考虑更改参数类型。

于 2012-04-16T20:23:10.607 回答
5

您正在将一个const char *(我们称之为不可修改的字符串)转换为一个char *(可修改的字符串),您丢弃了const限定符。

于 2012-04-16T20:22:57.943 回答
0

尝试更改声明/分配

const char *returnvalue = strstr(stringlowered, substringlowered);

char *returnvalue = strstr(stringlowered, substringlowered);

然后删除返回行中的演员表(你不再需要它了)。

于 2015-05-07T12:29:25.047 回答