strchr的问题

时间:2010-12-12 00:48:34

标签: c pointer-arithmetic

我无法理解为什么下面的C代码不起作用:

int obtainStringLength(char* str, char c1, char c2) {
    char* firstOcurrence = strchr(str, c1);
    char* endOcurrence = strchr(str, c2);
    return 2+(endOcurrence - firstOcurrence) / sizeof(char*);
}

我们的想法是找出c1c2之间的字符数:

printf("%d\n", obtainStringLength("abc def ghi", 'a', 'i')); //should yield 11

不幸的是,这总是打印1.问题是什么? strchr不应该像C#的string.IndexOf()一样工作吗?

4 个答案:

答案 0 :(得分:6)

sizeof(char*)划分?这是不正确的 - 减去两个指针的结果是一个数值(ptrdiff_t),对应于值的数量,而不是指针或地址的差异。

计算长度时还有一个错误。所以最后一行应该是这样的:

return 1 + (endOcurrence - firstOcurrence);

答案 1 :(得分:2)

由于不理解指针算法,你的return语句有几个问题。

指针减法已经除以元素大小,char*无论如何都是错误的类型。

你应该加1而不是2。

答案 2 :(得分:1)

因为每个字符都占用sizeof (char)个字节;不是sizeof (char*)字节。

根据定义,sizeof (char)是1,所以你可以省略它:

return 1 + (endOcurrence - firstOcurrence);

答案 3 :(得分:0)

不,strchr()返回正在搜索的字符的指针(地址),如果找不到该字符,则返回NULL。

这与IndexOf()非常不同。