计算缓冲区中的实例数失败测试用例

时间:2018-04-05 05:12:47

标签: c

/****************** 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++)

解决了我的问题。谢谢!

1 个答案:

答案 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中评估为01这一事实来简化循环,但请注意,对于许多程序员来说,这可能不太可读:

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);