C++使用std::find匹配字符数组与字符串vector时循环提前终止问题
问题原因分析
- 循环终止条件逻辑错误:
sizeof(this->my_char_array)返回的是整个数组占用的内存字节数,而非数组的元素个数。以64位系统为例,单个const char*占8字节,10个元素的数组总大小为80,会导致循环次数远超你实际初始化的元素数量。正确的元素个数计算逻辑为sizeof(my_char_array) / sizeof(my_char_array[0]),C++17及以上标准也可以直接用std::size(my_char_array)获取数组元素数。 - 空指针转字符串触发崩溃:你声明的数组大小为10,若仅初始化了前N个字符串字面量,剩余未显式初始化的元素会被默认置为
nullptr。当循环执行到i≥N时,(std::string)this->my_char_array[i]会尝试从空指针构造std::string,属于C++标准明确的未定义行为,几乎都会直接导致程序崩溃,因此你只能看到第一次循环的输出。 - 潜在笔误风险:你贴出的代码中输出行写为
this->my_char*_array[i],多了一个*符号,如果是实际代码中存在的笔误,相当于对const char*解引用拿到单个char值,也可能导致后续逻辑异常。 - 下标对应风险:匹配成功后你往结果中插入的是
this->keywords[i],需确认keywords数组和my_char_array的下标对应关系是否一致,避免取值错误或越界。
修复后代码示例
... static constexpr const char* my_char_array [10] { /* 字符串字面量 */ }; // 类的成员变量 std::vector<std::string> splitted_input { /* 存储若干C++字符串 */ }; std::vector<std::string> matched_keywords { /* 匹配到的结果将被复制到此处 */ }; // 计算数组实际元素个数 constexpr int arr_size = sizeof(my_char_array) / sizeof(my_char_array[0]); for (int i = 0; i < arr_size; i++) { // 跳过未初始化的空指针元素 if (this->my_char_array[i] == nullptr) { continue; } std::cout << "Comparing: " << this->my_char_array[i] << std::endl; auto value = std::find(splitted_input.begin(), splitted_input.end(), std::string(this->my_char_array[i])); if (value != splitted_input.end()) { matched_keywords.push_back(this->keywords[i]); } }
内容的提问来源于stack exchange,提问作者Alex Vergara
相关产品推荐
相关产品推荐

