2015-04-21 4 views
-2

Сейчас в моем текущем проекте у меня есть строка, как это:станд :: строка массив символов и массив символов в строку (C++)

std::string ordre="0x010x030x000x320x000x01"; 

И я хотел бы создать массив символов, глядя, как это с ним (и, если возможно обратным действием тоже):

unsigned char Com[]= {0x01, 0x03, 0x00, 0x32, 0x00, 0x01}; 

у меня нет проблем, работая со строкой, создавая другую зЬй :: строки и получить 0x01 часть в начале использование ordre.at() для символов, которые я хочу. Но я не могу найти способ поместить эту новую строку 0x01 в Com [1].

Запись непосредственно:

Com[1]=0x01; 

Это работает, но я хотел бы сделать что-то, где Com [1] может измениться.

ответ

0

Если вы используете C++: использование STL структур вместо (strugling с) массивы

Если я где я буду построить std::vector<unsigned char> и заполнить его динамически перебором x в петле.

Я хотел бы сделать вектор начинки, как например:

Примечание: Этот код работы Ith любого входа размера и не ограничивается 4 символов подстрок. Поэтому он более общий, но менее эффективный, чем другой код ответов. Выберите в соответствии с вашими потребностями

std::string order = "0x010x020x030x2360x10240x9001"; 
std::vector<int> coms; 

size_t pos = 0, it; 
while ((it = order.find("0x", pos + 1)) != std::string::npos) 
{ 
    coms.push_back(std::stoi(order.substr(pos, it-pos), 0, 16)); 
    pos = it; 
} 
coms.push_back(std::stoi(order.substr(pos), 0, 16)); 

дает:

0x01 = 1 
0x02 = 2 
0x03 = 3 
0x236 = 556 
0x1024 = 4132 
0x9001 = 36865 
+0

Похоже, что str и stoi не объявлены в библиотеках, которые у меня есть. У меня прямо сейчас: #include #include #include #include #include но я дает мне и ошибки: «ул» не был объявлен в этой области. – Wowy

+0

он переименовал ordre в str. Это просто имя переменной. Вы можете изменить его. –

+0

Я использовал 'str' в предыдущей версии этого ответа, прежде чем менять имя на' order', чтобы задать вопрос. Поэтому 'str' следует заменить на' order'.Этот код работает только с и Amxx

2

Сейчас в моем текущем проекте у меня есть строка, как это:

std::string ordre="0x010x030x000x320x000x01"; 

И я хотел бы создать массив символов, похожий на это с ним (И, если это возможно обратное действие тоже):

unsigned char Com[]= {0x01, 0x03, 0x00, 0x32, 0x00, 0x01}; 

Во-первых, "0x01" отличается от 0x01. Чтобы извлечь значения из строки, вам нужно будет прочитать ее в цикле, по четыре символа за раз:

if(ordre.size() % 4) 
    throw std::runtime_error{ "invalid string length; format is different" }; 
std::vector<int> values; 

auto b = std::begin(ordre); 
const auto e = std::end(ordre); 
while(b != e) 
{ 
    std::string s{ b, b+4 }; 
    values.push_back(std::stoi(s, 0, 16)); 
    b += 4; 
} 
+0

std :: stoi с базой 16 отвечает на вопрос, так что точки, но почему int? Он работает с unsigned char, и вы готовы принудительно использовать это в строковой длине, но затем хотите сохранить его как int? –

+0

Да, «0x01» не совпадает с 0x01. Но пользователи вводят строку (например, 01). Я не думаю, что могу создать unsigned char Com [] = 0x; а затем добавить часть 01 после ... – Wowy

+0

Он преобразует строку «0x01», используя http://en.cppreference.com/w/cpp/string/basic_string/stol –

Смежные вопросы