/****************** Count ****************************
Count the number of instances of the value in a buffer.
The data in the buffer range from -127 to +127
Input: size is the number of elements in the buffer.
value is the number in the buffer to search for and count
pt is a pointer to the buffer
Output: number of instances of the value in the buffer
Error conditions: Return 0 if the value is not found or if the buffer is empty.
Test cases
size value buffer
5, 3, {1,2,3,3,4} ;count=2
10, 0, {-3,-10,0,0,0,0,1,2,0,0} ;count=6
5, 6, {-1,2,3,-3,4} ;count=0
7, -8, {-8,-8,-8,-8,-8,-8,-8} ;count=7
0, -100, {} ;count=0
*/
uint32_t Count(uint32_t size, int8_t value, const int8_t *pt){
int32_t i, count, result = 0;
for(i = 0; count <= size; i++){
if(value == *pt){
result++;
}
count++;
pt++;
}
return(result);
}
我的代码适用于除4号以外的所有测试用例,缓冲区填充7 -8s。当我运行代码时,我的评分者说我的结果是5.我已经尝试通过手工和我的头部解析我的功能,我似乎无法理解为什么它没有返回正确的值。有没有人有任何想法?
更新
记住两个有用的注释并将for
循环更改为
(i = 0; i < size; i++)
解决了我的问题。谢谢!
答案 0 :(得分:1)
您的代码具有未定义的行为,因为循环使用了错误的索引:
i
,但您测试未初始化的count
。count <= size
可能会被一个人关闭。如果count
初始化为0
,则循环将运行size + 1
次,并取消引用pt
指向的数组末尾之外的元素。您应该简化代码并使用单个索引i
进行迭代和访问数组:
uint32_t Count(uint32_t size, int8_t value, const int8_t *pt) {
int32_t i, count = 0;
for (i = 0; i < size; i++) {
if (pt[i] == value) {
count++;
}
}
return count;
}
你甚至可以通过利用比较运算符在C中评估为0
或1
这一事实来简化循环,但请注意,对于许多程序员来说,这可能不太可读:
uint32_t Count(uint32_t size, int8_t value, const int8_t *pt) {
int32_t i, count = 0;
for (i = 0; i < size; i++) {
count += (pt[i] == value);
}
return count;
}
如果你坚持使用指针,你可以计算结束指针并在for循环中使用它:
uint32_t Count(uint32_t size, int8_t value, const int8_t *pt) {
int32_t count = 0;
const int8_t *pt_end;
for (pt_end = p + size; pt < pt_end; pt++) {
count += (*pt == value);
}
return count;
}
另请注意,参数的顺序有点令人困惑。这可能不是你的决定,但在C中更常见的是在指针之后传递数组的大小以及在该对之后的搜索值。 API将更加直观:
uint32_t Count(const int8_t *pt, uint32_t size, int8_t value);