Преобразование int[] в String в C++

У меня есть строка, определенная как std::string header = "00110033";, теперь мне нужна строка для хранения байтовых значений цифр, как если бы она была построена следующим образом.

char data_bytes[] = { 0, 0, 1, 1, 0, 0, 3, 3};
std::string header = new std::string(data_bytes, 8).c_str());

Я преобразовал исходную строку в массив int, используя atoi. Теперь я не уверен, как сделать строку из него. Дайте мне знать, если есть лучший подход.


person Manoj    schedule 07.03.2011    source источник
comment
Я не могу понять ваш вопрос.   -  person Nawaz    schedule 07.03.2011
comment
синтаксис 2-й строки неверен. Кроме того, каково намерение new здесь?   -  person Karl von Moor    schedule 07.03.2011
comment
Зачем вам это нужно? Что вы собираетесь делать, если массив содержит значение, которое не находится между 0 и 9?   -  person Karl Knechtel    schedule 07.03.2011
comment
Неэффективно (из-за копирования) и утечки памяти (из-за new без сохранения указателя на соответствующий delete) сказать std::string header = (new std::string(data_bytes, 8))->c_str(); (или что вы имели в виду). Вместо этого вы можете просто сказать std::string header(data_bytes, 8);.   -  person Jon Purdy    schedule 07.03.2011


Ответы (5)


вы могли бы написать небольшую функцию

string int_array_to_string(int int_array[], int size_of_array) {
  string returnstring = "";
  for (int temp = 0; temp < size_of_array; temp++)
    returnstring += itoa(int_array[temp]);
  return returnstring;
}

не проверено!

немного другой подход

string int_array_to_string(int int_array[], int size_of_array) {
  ostringstream oss("");
  for (int temp = 0; temp < size_of_array; temp++)
    oss << int_array[temp];
  return oss.str();
}
person ultifinitus    schedule 07.03.2011
comment
@ultifinitus atoi преобразует строку в int, а вам нужно преобразовать int в строку. Вам нужно использовать itoa, которая не является стандартной функцией, поэтому, вероятно, лучшим решением будет преобразовать int в символ, добавив «0» (см. мое решение). Вы также можете использовать лексический состав: boost::lexical_cast<std::string>(int_array[temp]); - person UmmaGumma; 07.03.2011
comment
Вместо этого используйте std::stringstream, это безопаснее. - person RageD; 07.03.2011
comment
О господи, я переделаю его, это была 5-секундная функция, черт возьми! знак равно - person ultifinitus; 07.03.2011

Сделай это:

  char data_bytes[] = { '0', '0', '1', '1', '0', '0', '3', '3', '\0'};
  std::string header(data_bytes, 8);

Или, может быть, вы хотите сделать это:

  std::stringstream s;
  s << data_bytes;
  std::string header = s.str();

Демо на ideone: http://ideone.com/RzrYY


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

Нужны последние \0 в data_bytes. Также см. этот интересный вывод здесь: http://ideone.com/aYtlL

PS: я не знал этого раньше, благодаря Ашоту я узнал эту разницу, экспериментируя!

person Nawaz    schedule 07.03.2011
comment
Вы не можете хранить целые числа в массиве символов - person Nick Rolando; 07.03.2011
comment
@Nawaz -1 data_bytes не заканчивается на «\ 0», поэтому вы не можете его распечатать. + В обоих случаях ваша строка не будет равна строке (00110033); - person UmmaGumma; 07.03.2011
comment
Вы не получите ожидаемых результатов - person Nick Rolando; 07.03.2011
comment
@Ashot: Я это видел и тоже исправил. @Nicklamort: проблема устранена. Однако это не имело никакого отношения к хранению целых чисел в char. - person Nawaz; 07.03.2011
comment
@Nawaz удалить последний '\ 0' в data_bytes. Ваша строка теперь заканчивается двойным '\0' :) См. эту тему stackoverflow.com/questions/4711449/. - person UmmaGumma; 07.03.2011
comment
@Ashot: Я думаю, что это правильно. См. это (sizeof и strlen): ideone.com/aYtlL - person Nawaz; 07.03.2011
comment
@Eugen Constantin Dinca, вы правы, поэтому я отменяю свой отрицательный голос, но если последний «\ 0» не нужен, зачем его писать? - person UmmaGumma; 07.03.2011
comment
@Ashot: я обновил ссылку в своем предыдущем комментарии. Посмотрите еще раз: ideone.com/aYtlL - person Nawaz; 07.03.2011
comment
@Nawaz, я не могу повторно проголосовать за этот ответ, пока ты не отредактируешь свой вопрос - person UmmaGumma; 07.03.2011
comment
Возможно, вам следует дать ответ, соответствующий вопросу, вместо того, чтобы интерпретировать вопрос в соответствии с вашим ответом. - person Eugen Constantin Dinca; 07.03.2011
comment
@Ashot: я не только отредактировал, но и упомянул разницу. Сегодня узнал кое-что новое. Спасибо! - person Nawaz; 07.03.2011

Предполагая, что вы используете «довольно обычную» систему, в которой числовые значения от '0' до '9' идут последовательно, вы можете просто перебрать каждый элемент и вычесть '0':

for(int i = 0; i < header.size(); ++i)
{
    header[i] -= '0';
}
person Mark B    schedule 07.03.2011
comment
Разве вы не должны прибавлять, а не вычитать? - person Eugen Constantin Dinca; 07.03.2011
comment
@Eugen Constantin Dinca OP имеет строку типа 00111 и хочет, чтобы она была переведена в строку с этими фактическими значениями байтов, например, 00111 -> \000\000\001\001\001. Таким образом вы вычитаете. - person Mark B; 07.03.2011

Ты можешь это сделать:

std::string header( data_bytes, data_bytes + sizeof( data_bytes ) );
std::transform( header.begin(), header.end(), header.begin(), 
     std::bind1st( std::plus< char >(), '0' ) );
person Eugen Constantin Dinca    schedule 07.03.2011

Если integ[] — массив целых чисел, а s — последняя строка, которую мы хотим получить,

string s="";

for(auto i=0;i<integ.size()-1; ++i)
    s += to_string(ans[i]); 

cout<<s<<endl;
person Pe Dro    schedule 03.11.2019