Что я могу сделать с неподписанным символом *, когда мне нужна строка? - PullRequest
3 голосов
/ 19 февраля 2011

Предположим, что у меня есть неподписанный символ *, давайте назовем его: 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;
}

Проблема в том, что мне нужна строка для передачи в эту функцию или хотя бы символ * (который может быть преобразован в строку без проблем).

Я могу решить эту проблему, применив:

reinterpret_cast<char *>(some_data)

А затем передать его функции все окей-доки

...

Пока я не использовал valgrind и не обнаружил, что это может привести к незначительной утечке памяти.

Conditional jump or move depends on uninitialised value(s)  __GI_strlen

Из того, что я собрал, это связано с переинтерпретацией кастинга, который испортил ноль, указывающий конец строки. Таким образом, когда c ++ пытается выяснить длину строки, она становится бесполезной.

Учитывая, что я не могу изменить тот факт, что some_data представляется беззнаковым символом *, есть ли способ использовать мою функцию grabFooValue, не имея таких тонких проблем?

Я бы предпочел сохранить имеющуюся у меня функцию поиска значений, если только нет явно лучшего способа вырвать значение foo из этого (иногда большого) беззнакового символа *.

И несмотря на то, что unsigned char * some_data варьируется, а иногда и имеет большой размер, я могу предположить, что значение 'foo' будет где-то на раннем этапе, поэтому я подумал о том, чтобы попытаться получить char * первого X символы знака без знака *. Это потенциально может избавить от проблемы длины строки, если указать, где заканчивается символ *.

Я пытался использовать комбинацию strncpy и casting, но пока без кубиков. Есть мысли?

1 Ответ

6 голосов
/ 19 февраля 2011

Вам необходимо знать длину данных, на которые указывает ваш неподписанный символ, поскольку они не заканчиваются на 0.

Затем используйте, например:

std::string s((char *) some_data, (char *) some_data + len);
...