假设我有一个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)
然后将其传递给函数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和cast的组合,但到目前为止还没有骰子。有什么想法吗?
答案 0 :(得分:6)
您需要知道unsigned char *指向的数据的长度,因为它不是0终止的。
然后,使用例如:
std::string s((char *) some_data, (char *) some_data + len);