1

次の C コードが機能しない理由がわかりません。

int obtainStringLength(char* str, char c1, char c2) {
    char* firstOcurrence = strchr(str, c1);
    char* endOcurrence = strchr(str, c2);
    return 2+(endOcurrence - firstOcurrence) / sizeof(char*);
}

アイデアは、c1との間の文字数を見つけることc2です。

printf("%d\n", obtainStringLength("abc def ghi", 'a', 'i')); //should yield 11

残念ながら、これは常に 1 と表示されます。何が問題なのですか? strchrC# のように動作するべきではありませんstring.IndexOf()か?

4

4 に答える 4

6

sizeof(char*)?による除算 それは正しくありません。2 つのポインターを減算した結果は、値の数に対応する数値 ( ptrdiff_t) であり、ポインターやアドレスの差ではありません。

長さの計算には、1 つずつずれているエラーもあります。したがって、最後の行は次のようになります。

return 1 + (endOcurrence - firstOcurrence);
于 2010-12-12T00:51:09.903 に答える
2

ポインター演算を理解していないため、 return ステートメントにはいくつかの問題があります。

ポインター減算は既に要素サイズで除算されており、char*とにかく間違った型でした。

2 ではなく 1 を追加する必要があります。

于 2010-12-12T00:52:11.197 に答える
1

sizeof (char)各文字は正確にバイトを占めるためです。sizeof (char*)バイトではありません。

そしてsizeof (char)、定義 1 により、省略できます。

return 1 + (endOcurrence - firstOcurrence);

于 2010-12-12T00:51:52.977 に答える
0

いいえ、strchr() は検索対象の文字のポインター (アドレス) を返します。文字が見つからない場合は NULL を返します。

これは IndexOf() とは大きく異なります。

于 2010-12-12T00:51:21.437 に答える