1

我不明白为什么以下 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*);
}

c1这个想法是找出和之间有多少个字符c2

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

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

4

4 回答 4

6

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

在计算长度时也存在误差。所以最后一行应该如下所示:

return 1 + (endOcurrence - firstOcurrence);
于 2010-12-12T00:51:09.903 回答
2

由于不了解指针运算,您的 return 语句有几个问题。

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

你应该加 1,而不是 2。

于 2010-12-12T00:52:11.197 回答
1

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

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

return 1 + (endOcurrence - firstOcurrence);

于 2010-12-12T00:51:52.977 回答
0

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

这与 IndexOf() 非常不同。

于 2010-12-12T00:51:21.437 回答