0

関数をコーディングしました。入力した1文字列と1文字を取得します。文字を始点とし、この文字から印刷します。しかし、私のコードでは 2 つのエラーが発生します。手伝って頂けますか?

#include <stdio.h>

char * mystrchr(const char * from, char c)
{
    int i;
    for(i=0; from[i]!='\0'; i++)
        if(from[i]==c)

    return (const *)from+i;

return 0;
}

int main()
{
    char *a;

    a=mystrchr("asdfg","d" );

    printf("%s", a);

return 0;
}

注: 警告の 1 つはタイトルに収まりません。したがって、私はそこに書いた:

「mystrchr」の引数 2 を渡すと、キャストなしでポインターから整数が作成されます [デフォルトで有効]

4

4 に答える 4

2
#include <stdio.h>

char * mystrchr(const char * from, char c) {
   int i;
   for(i=0; from[i]!='\0'; i++)
      if(from[i]==c)
         return from+i;
   return 0;
}

int main() {
    char *a;
    a=mystrchr("asdfg",'d' );
    printf("%s", a);
    return 0;
}
于 2013-01-04T17:32:55.440 に答える
1

'mystrchr' の引数 2 を渡すと、キャストなしでポインタから整数が作成されます

したがって、ポインターを渡しています("d"char [2]であり、関数に渡されると崩壊しchar *ます)が、関数はchar整数型であるを期待しています。

修正: 変更

mystrchr("asdfg", "d");

mystrchr("asdfg", 'd');

(一重引用符で囲まれていることに注意してください。一重引用'd'符は acharを表し、二重引用符は文字列リテラルを表します。)

于 2013-01-04T17:17:32.250 に答える
0

あなたの関数はこのように宣言されています

char *mystrchr(const char *from, char c)

また、const 文字列の途中に非 const ポインターを返すように設計されていfromます。const データを非 const にキャストしてはなりません。したがって、次のように関数を宣言する必要があります。

const char *mystrchr(const char *from, char c)

その時点で、returnステートメントのキャストを削除できます。

return from+i;

ポインターを使用して反復する場合、関数は間違いなくより単純になります。

const char *mystrchr(const char *from, const char c)
{
    for (const char *p = from; *p; p++)
        if (*p == c)
            return p;
    return 0;
}

もう 1 つの問題は、リテラル"d"が ではなくヌルで終わる C 文字列リテラルであることですchar。リテラル'd'を指定するには、を使用する必要があります。char

于 2013-01-04T17:24:21.170 に答える
0

2 番目のパラメーターに単一引用符を使用して、1 つの警告を取り除くことができます。"d"一重引用符でパスを渡し'd'ています。このような : mystrchr("asdfg", 'd');

"d"char*関数定義で引数を受け入れている間はタイプですchar。したがって、警告のみです。

また、ここで型キャストする必要がないようにコードreturn (const *)from+i;を変更します。return from+i;

ais type であるため、 typechar*を返して soconst char *に代入const char*してchar*います Incompatible pointer type 警告メッセージを取得しています

于 2013-01-04T17:16:37.607 に答える