假设我有一个unsigned char*,我们称它为:some_data
unsigned char* some_data;
而some_data里面有类似url的数据。例如:
"aasdASDASsdfasdfasdf&Foo=cow&asdfasasdfadsfdsafasd"
我有一个函数可以获取 'foo' 的值,如下所示:
// looks for the value of 'foo'
bool grabFooValue(const std::string& p_string, std::string& p_foo_value)
{
size_t start = p_string.find("Foo="), end;
if(start == std::string::npos)
return false;
start += 4;
end = p_string.find_first_of("& ", start);
p_foo_value = p_string.substr(start, end - start);
return true;
}
问题是我需要一个字符串传递给这个函数,或者至少是一个 char*(可以转换成字符串没问题)。
我可以通过转换来解决这个问题:
reinterpret_cast<char *>(some_data)
然后传给函数all okie-dokie
...
直到我使用 valgrind 并发现这会导致微妙的内存泄漏。
Conditional jump or move depends on uninitialised value(s) __GI_strlen
根据我收集到的信息,它与重新解释转换弄乱了指示字符串结尾的空值有关。因此,当 c++ 试图计算出字符串的长度时,事情就变得很麻烦了。
鉴于我无法改变 some_data 由 unsigned char* 表示的事实,是否有一种方法可以在没有这些细微问题的情况下使用我的 grabFooValue 函数?
我宁愿保留我已经拥有的值查找功能,除非显然有更好的方法从这个(有时很大)unsigned char* 中提取 foo 值。
尽管 unsigned char* some_data 不断变化,有时大小很大,但我可以假设 'foo' 的值早早出现在某个地方,所以我的想法是尝试获取第一个 X 的 char* unsigned char* 的字符。通过让我设置 char* 结束的位置,这可能会消除字符串长度问题。
我尝试结合使用 strncpy 和转换,但到目前为止还没有成功。有什么想法吗?
最佳答案
您需要知道 unsigned char * 指向的数据的长度,因为它不是以 0 结尾的。
然后,使用例如:
std::string s((char *) some_data, (char *) some_data + len);
关于c++ - 当我需要一个字符串时,我可以用 unsigned char* 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047783/