8

-Wcast-qualこの警告を stristr() のreturn行に出力します。何が問題ですか ?

警告: キャストはポインター ターゲット型から修飾子を破棄します

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へのポインターとして宣言しました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 に答える