如何将字符串中第一次出现的字符索引作为int而不是指向其位置的指针?
答案 0 :(得分:5)
如果在C中有两个指向数组的指针,则可以执行以下操作:
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
,其范围可能与int
不同。为了完全正确,索引的计算和打印最好如下:
ptrdiff_t index = addrOf4 - xyzzy; // Figure out and print index.
printf ("Index is %td\n", index);
请注意,只有当您的数组足够大以至于差异不适合int
时,这才会成为问题。这是可能的,因为这两种类型的范围没有直接关系,因此,如果您高度重视可移植代码,则应使用ptrdiff_t
变体。
答案 1 :(得分:3)
使用指针算术:
char * pos = strchr( str, c );
int npos = (pos == NULL) ? -1 : (pos - str);
答案 2 :(得分:0)
如果你正在处理std :: string而不是普通的c-strings,那么你可以使用std :: string :: find_first_of
http://www.cplusplus.com/reference/string/string/find_first_of/