У меня есть карта, которую я хочу сбросить в массив символов. Массив должен выглядеть следующим образом:
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);
Стандартный контейнер последовательности символов - 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');
}
NUL
( \0
) символов, как пожелает OP.
Вы используете memcpy
для копирования из адреса строки std ::. Вы хотите скопировать из содержимого строки в key.c_str()
и value.c_str()
.
vector<char>
а неstring
? memcpy и memset здесь не нужны.c_str()
который уже имеет завершающий NUL, и копирование его вpChar