0

文字列内で最初に出現する文字のインデックスを、その位置へのポインターではなく int として取得するにはどうすればよいですか?

4

3 に答える 3

5

C の配列へのポインターが 2 つある場合は、次のように簡単に実行できます。

index = later_pointer - base_address;

base_address配列自体はどこにありますか。

例えば:

#include <stdio.h>
int main (void) {
    int xyzzy[] = {3,1,4,1,5,9};       // Dummy array for testing.

    int *addrOf4 = &(xyzzy[2]);        // Emulate strchr-type operation.

    int index = addrOf4 - xyzzy;       // Figure out and print index.
    printf ("Index is %d\n", index);   //   Or use ptrdiff_t (see footnote a).

    return 0;
}

出力:

Index is 2

ご覧のとおり、基になる型に関係なくインデックスを提供するために正しくスケーリングされます (重要ではありませんがchar、一般的なケースで知っておくと便利です)。

したがって、特定のケースで、文字列がmystringであり、からの戻り値strchrがである場合chpos、 を使用chpos - mystringしてインデックスを取得するだけです (もちろん、文字が見つかったと仮定すると、つまりchpos != NULL)。


(a)コメントで正しく指摘されているように、ポインター減算の型はptrdiff_twhich であり、 から までの範囲が異なる場合がありますint。完全に正確であるためには、インデックスの計算と出力は次のように行う方がよいでしょう:

    ptrdiff_t index = addrOf4 - xyzzy;       // Figure out and print index.
    printf ("Index is %td\n", index);

これが問題になるのは、配列が十分に大きいために差がint. 2 つの型の範囲は直接関連していないため、これは可能です。そのため、移植可能なコードを高く評価する場合は、ptrdiff_tバリアントを使用する必要があります。

于 2012-11-01T23:51:14.943 に答える
3

ポインター演算を使用します。

char * pos = strchr( str, c );
int npos = (pos == NULL) ? -1 : (pos - str);
于 2012-11-01T23:52:01.033 に答える
0

std::string を扱っていて、プレーンな c-string ではない場合は、 std::string::find_first_of を使用できます

http://www.cplusplus.com/reference/string/string/find_first_of/

于 2012-11-01T23:53:51.697 に答える