0

如何将字符串中第一次出现的字符的索引作为 int 而不是指向其位置的指针?

4

3 回答 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的返回值,只需使用来获取索引(假设您当然找到了字符,即)。strchrchposchpos - mystringchpos != 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 回答