解决void指针转换后字符串比较的编译错误并实现相等判断
解决指针类型不匹配编译错误并实现字符串比较
编译错误原因
报错行if(dd == "BBBB_DDDDD_XXUSTYY_99_7DFFXX9B67")存在两个核心问题:
- 类型不匹配:
dd是unsigned char*,字符串字面量是const char*,直接比较会触发类型不兼容的编译错误; - 逻辑错误:直接比较指针地址毫无意义,实际需要的是比较指针指向的内容是否相等,而非指针本身。
解决思路与代码修改
要实现正确的字符串比较,需将uint8_t*指向的内存转换成可用于字符串比较的类型,同时注意字符串结束符或明确内存长度:
方案1:添加字符串结束符,用C风格字符串比较
- 在构造
vector<uint8_t>时添加\0,确保符合C风格字符串格式; - 将
uint8_t*转换为const char*,使用strcmp比较内容。
修改后完整代码:
#include <iostream> #include <vector> #include <cstring> // 引入strcmp所需头文件 using namespace std; void Init(void* tmp) { auto dd = static_cast<std::uint8_t *>(tmp); // 将uint8_t*转换为const char*,单字节类型转换安全 const char* input_str = reinterpret_cast<const char*>(dd); const char* target_str = "BBBB_DDDDD_XXUSTYY_99_7DFFXX9B67"; // strcmp返回0表示内容相等 if(std::strcmp(input_str, target_str) == 0) std::cout<<"equal"; else std::cout<<"not equal"; } std::string PadIt(std::string& str, std::size_t outputLength) { if (outputLength > str.size()) { char paddingChar = ' '; str.insert(str.size(), outputLength - str.size(), paddingChar); } else if (outputLength < str.size()) { // 若目标长度小于原字符串,截断到指定长度 str = str.substr(0, outputLength); } std::cout<<"PadIt str is : "<<str<<" size is: "<<str.size()<<std::endl; return str; } int main() { std::string key_str = "BBBB_DDDDD_XXUSTYY_99_7DFFXX9B67"; std::string obid = PadIt(key_str,16); std::vector<std::uint8_t> vec(obid.begin(),obid.end()); vec.push_back('\0'); // 添加字符串结束符,确保C风格字符串格式 Init(vec.data()); }
方案2:明确内存长度,用C++字符串比较
- 修改
Init函数参数,传入内存块的长度; - 直接从
uint8_t*指向的内存构造std::string,利用std::string的比较运算符判断内容。
修改后完整代码:
#include <iostream> #include <vector> #include <string> using namespace std; // 新增size_t参数,传入内存块长度 void Init(void* tmp, size_t data_len) { auto dd = static_cast<std::uint8_t *>(tmp); // 从指定长度的内存构造std::string std::string input_str(reinterpret_cast<const char*>(dd), data_len); std::string target_str = "BBBB_DDDDD_XXUSTYY_99_7DFFXX9B67"; if(input_str == target_str) std::cout<<"equal"; else std::cout<<"not equal"; } std::string PadIt(std::string& str, std::size_t outputLength) { if (outputLength > str.size()) { char paddingChar = ' '; str.insert(str.size(), outputLength - str.size(), paddingChar); } else if (outputLength < str.size()) { // 若目标长度小于原字符串,截断到指定长度 str = str.substr(0, outputLength); } std::cout<<"PadIt str is : "<<str<<" size is: "<<str.size()<<std::endl; return str; } int main() { std::string key_str = "BBBB_DDDDD_XXUSTYY_99_7DFFXX9B67"; std::string obid = PadIt(key_str,16); std::vector<std::uint8_t> vec(obid.begin(),obid.end()); // 传入vector的大小作为内存长度 Init(vec.data(), vec.size()); }
说明
- 原
PadIt函数仅处理字符串填充,未处理截断逻辑,上述代码补充了截断逻辑,确保当outputLength=16时,字符串会被截断为16字符,此时与原目标字符串比较会输出not equal,符合需求; - 两种方案都解决了指针类型不匹配的编译错误,同时实现了正确的字符串内容比较。
内容的提问来源于stack exchange,提问作者ganeshredcobra
相关产品推荐
相关产品推荐

