以下strcmp()代码有什么问题?

时间:2017-09-30 08:35:30

标签: c arrays for-loop strcmp strcpy

我有一个结构的多维数组,其内容初始化为' \ 0'最初和稍后偶尔。插入一些值后,它将按fing_print按升序排序。然后将排序数组的前n个条目复制到另一个数组中。在我的实现中,某些数组元素可能没有赋值,因此它们包含' \ 0'之前分配给它们的值,在复制到另一个数组时需要忽略它们。

我的问题是,代码在" __ DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1(errno_t,strcpy_s,_Post_z_ char,_Destination,_In_z_ char const *,_ Source)中断。

经过调试后,我注意到它突破了 strcpy_s(selected[j][r].fing_print, hash_table[j][i].fing_print); 行 当只有 j(BUCKETS)包含数据时。

for (int j = 0; j < BUCKETS; ++j) {
    // select rep fps here according to select size

    for (int i = 0,r=0; i<B_ENTRIES, r < SELECT_SIZE; ++i) {
        if (!strcmp(hash_table[j][i].fing_print, garb)) {
            // garb contains '\0'
            continue;
        }
        prev = i-1;
        if (!strcmp(hash_table[j]i].fing_print,
                    hash_table[j][prev].fing_print)) {
            // make sure the same fingerprint is not selected twice
            continue;
        }
        strcpy_s(selected[j][r].fing_print,
                 hash_table[j][i].fing_print);
        ++r;    
    }
}

1 个答案:

答案 0 :(得分:0)

如评论部分所述,我的错误是在循环退出条件for (int i = 0,r=0; i<B_ENTRIES, r < SELECT_SIZE; ++i)中使用逗号。将其修改为以下工作正常。

for (int j = 0; j < BUCKETS; ++j) {
    // select rep fps here according to select size
for (int i = 0,r=0; i<B_ENTRIES && r < SELECT_SIZE; ++i) {
    if (!strcmp(hash_table[j][i].fing_print, garb)) {
        // garb contains '\0'
        continue;
    }
    prev = i-1;
    if (!strcmp(hash_table[j]i].fing_print,
                hash_table[j][prev].fing_print)) {
        // make sure the same fingerprint is not selected twice
        continue;
    }
    strcpy_s(selected[j][r].fing_print,
             hash_table[j][i].fing_print);
    ++r;    
  }
}

strcpy_s()函数工作正常,但是再次如上面的注释所指出的那样,它错过了一个参数,它是目标数组的大小,因此应该更正为

strcpy_s(selected[j][r].fing_print,sizeof(selected[j][r].fing_print),
             hash_table[j][i].fing_print);