如何在C中查找字符串中字符的索引?

如何在C中查找字符串中字符的索引?,c,indexing,strchr,C,Indexing,Strchr,假设我有一个字符串“qwerty”,我希望找到e字符的索引位置。(在这种情况下,索引将为2) 用C怎么做 我找到了strchr函数,但它返回一个指向字符的指针,而不是索引。只需从strchr返回的内容中减去字符串地址: char *string = "qwerty"; char *e; int index; e = strchr(string, 'e'); index = (int)(e - string); 请注意,结果是基于零的,因此在上面的示例中,它将是2 void myFunc(ch

假设我有一个字符串
“qwerty”
,我希望找到
e
字符的索引位置。(在这种情况下,索引将为
2

用C怎么做


我找到了
strchr
函数,但它返回一个指向字符的指针,而不是索引。

只需从strchr返回的内容中减去字符串地址:

char *string = "qwerty";
char *e;
int index;

e = strchr(string, 'e');
index = (int)(e - string);
请注意,结果是基于零的,因此在上面的示例中,它将是2

void myFunc(char* str, char c)
{
    char* ptr;
    int index;

    ptr = strchr(str, c);
    if (ptr == NULL)
    {
        printf("Character not found\n");
        return;
    }

    index = ptr - str;

    printf("The index is %d\n", index);
    ASSERT(str[index] == c);  // Verify that the character at index is the one we want.
}

此代码目前未经测试,但它展示了正确的概念。

您也可以使用strcspn(string,“e”),但这可能会慢得多,因为它能够处理多个可能的字符的搜索。使用strchr和减去指针是最好的方法。

那么:

char *string = "qwerty";
char *e = string;
int idx = 0;
while (*e++ != 'e') idx++;
复制到e以保留原始字符串,我想如果您不介意,您可以在*string上操作,这应该可以做到:

//Returns the index of the first occurence of char c in char* string. If not found -1 is returned.
int get_index(char* string, char c) {
    char *e = strchr(string, c);
    if (e == NULL) {
        return -1;
    }
    return (int)(e - string);
}

这是“正确的”,但理论上很可怕,因为标准中没有任何东西可以阻止字符串的长度大大超过普通“int”的容量。如果您可以依赖于C99,请为此使用uintpttr_t(在stdint.h中定义)。它还应该消除对演员阵容的需求。是的,这是真的。然而,我认为至少对于初学者来说,int会更清晰,而且我确信OP不会处理5gb的字符串。
size\u t
可能是最清晰的一个,因为它足够大,可以容纳任何对象(以及任何字符串)的长度。这段代码的真正问题是,当字符串中找不到字符时,您应该使用
if(e){}else{}
来处理大小写。@wj32:对于初学者来说,学习使用正确的类型很重要。大多数情况下(99%,我猜)
int
都是错误的,所有这些初学者的例子都教会了他们错误的态度。@iLearner:非常有趣的是,为什么strchr的实现要求char*作为第二个参数。您使用什么
C
编译器?可能重复的