从strchr获取int而不是指针

时间:2012-11-01 23:50:09

标签: c string

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

3 个答案:

答案 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并不重要,但在一般情况下知道它很有用。)

因此,对于您的具体情况,如果您的字符串为mystringstrchr的返回值为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/