Дамп карта <строка, строка> в вектор символов

0

У меня есть карта, которую я хочу сбросить в массив символов. Массив должен выглядеть следующим образом:

key1=value\0key2=value2\0key3=value3\0\0

За каждым ключом map следует '=', значение и завершающий NUL.

Мой подход производит мусор:

char* pChar = &data[0];
std::vector<char> writable;
string key;
string value;

for (std::map<std::string, std::string>::const_iterator iter = myMap.begin(); iter != myMap.end(); iter++)
{
    writable.resize( iter->first.size()  + iter->second.size() + 2);
    key = iter->first;
    value = iter->second;
    memcpy(&writable[0], &key, key.length());
    std::fill(writable.begin() +  key.length(), writable.begin() +  key.length(), 0x3D );
    memcpy(&writable[key.length() + 1], &value,  value.length());
    std::fill(writable.begin() +  key.length() + value.length() + 1, writable.begin() + key.length() + value.length() + 1, 0x0 );
    memcpy(pChar, &writable[0], writable.size());
    pChar += writable.size();
}
memset(pChar, 0, 1);
  • 1
    почему vector<char> а не string ? memcpy и memset здесь не нужны.
  • 0
    Спасибо, это на самом деле имеет больше смысла. Просто конкатенация строки, затем взятие c_str() который уже имеет завершающий NUL, и копирование его в pChar
Теги:
string
vector

2 ответа

2

Стандартный контейнер последовательности символов - std::string, ваш код может быть уменьшен до:

int main() {
    std::map<std::string, std::string> m = { 
        { "k0" , "v0" } ,
        { "k1" , "v1" },
        { "k2" , "v2" }, 
        { "k3" , "v3" } 
    };

    std::string result;

    for(auto& pair : m)
        result += pair.first + "=" + pair.second + " ";

    std::cout << result;
}

И вы можете легко получить std::vector<char> из string если вам это действительно нужно:

std::vector<char> v(result.begin(), result.end());

И вы можете, конечно, получить базовый массив c- c_str() с помощью c_str() члена c_str().


РЕДАКТИРОВАТЬ:

Если вам действительно нужен std::vector<char> с символом NUL в качестве разделителей, вы можете использовать std::copy и std::back_inserter:

std::vector<char> result;

for(auto& pair : m)
{
   std::copy(pair.first.begin(), pair.first.end(), std::back_inserter(result));
   std::copy(pair.second.begin(), pair.second.end(), std::back_inserter(result));
   result.push_back('\0');
}
  • 0
    Это не использует NUL ( \0 ) символов, как пожелает OP.
  • 0
    Добавлено как редактирование, спасибо за комментарий.
0

Вы используете memcpy для копирования из адреса строки std ::. Вы хотите скопировать из содержимого строки в key.c_str() и value.c_str().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню