我无法理解为什么下面的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()
一样工作吗?
答案 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()非常不同。