文字列内で最初に出現する文字のインデックスを、その位置へのポインターではなく int として取得するにはどうすればよいですか?
3 に答える
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_t
which であり、 から までの範囲が異なる場合がありますint
。完全に正確であるためには、インデックスの計算と出力は次のように行う方がよいでしょう:
ptrdiff_t index = addrOf4 - xyzzy; // Figure out and print index.
printf ("Index is %td\n", index);
これが問題になるのは、配列が十分に大きいために差がint
. 2 つの型の範囲は直接関連していないため、これは可能です。そのため、移植可能なコードを高く評価する場合は、ptrdiff_t
バリアントを使用する必要があります。
ポインター演算を使用します。
char * pos = strchr( str, c );
int npos = (pos == NULL) ? -1 : (pos - str);
std::string を扱っていて、プレーンな c-string ではない場合は、 std::string::find_first_of を使用できます
http://www.cplusplus.com/reference/string/string/find_first_of/