以下 strcmp() 代码有什么问题?
What is wrong with the following strcmp() code?
我有一个结构的多维数组,其内容最初被初始化为'\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 '[=10=]'
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;
}
}
如评论部分所述,我的错误是在循环退出条件中使用了逗号 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 '[=10=]'
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);
我有一个结构的多维数组,其内容最初被初始化为'\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 '[=10=]'
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;
}
}
如评论部分所述,我的错误是在循环退出条件中使用了逗号 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 '[=10=]'
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);