如何将字符串中第一次出现的字符的索引作为 int 而不是指向其位置的指针?
问问题
590 次
3 回答
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
但在一般情况下了解它很有用)。
因此,对于您的具体情况,如果您的字符串是并且从ismystring
的返回值,只需使用来获取索引(假设您当然找到了字符,即)。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
变体。
于 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 字符串,那么您可以使用 std::string::find_first_of
http://www.cplusplus.com/reference/string/string/find_first_of/
于 2012-11-01T23:53:51.697 回答