5

I have a string defined as std::string header = "00110033"; now I need the string to hold the byte values of the digits as if its constructed like this

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

I converted the initial string to int array using atoi. Now i'm not sure how to make the string out of it. Let me know if there is any better approach.

Manoj
  • 5,542
  • 9
  • 54
  • 80
  • 1
    I am unable to understand your question. – Nawaz Mar 07 '11 at 17:41
  • syntax of 2nd line isn't correct. Also, what's the intention of the `new` here? – Karl von Moor Mar 07 '11 at 17:42
  • Why do you need to do this? What are you going to do if the array contains a value that is not between 0 and 9? – Karl Knechtel Mar 07 '11 at 18:03
  • It's inefficient (due to copying) and a memory leak (due to `new` without storing the pointer for a corresponding `delete`) to say `std::string header = (new std::string(data_bytes, 8))->c_str();` (or whatever it is you meant). You can just say `std::string header(data_bytes, 8);` instead. – Jon Purdy Mar 07 '11 at 18:18

6 Answers6

3

you could write a little function

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;
}

untested!

a slightly different approach

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();
}
Optimus Prime
  • 6,817
  • 5
  • 32
  • 60
ultifinitus
  • 1,813
  • 2
  • 19
  • 32
  • 1
    @ultifinitus atoi converts string to int, while you need to convert int to string. You need to use itoa, which is not standard function, so probably best solution is to convert int to character by adding '0' (see my solution). You also can use lexical cast: `boost::lexical_cast(int_array[temp]);` – UmmaGumma Mar 07 '11 at 18:01
  • 1
    Use `std::stringstream` instead, it's safer. – RageD Mar 07 '11 at 20:09
  • Oh good heavens, I'll revamp it, it was a 5 second function geez! =) – ultifinitus Mar 07 '11 at 20:14
2

Do this:

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

Or maybe, you want to do this:

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

Demo at ideone : http://ideone.com/RzrYY


EDIT:

Last \0 in data_bytes is necessary. Also see this interesting output here: http://ideone.com/aYtlL

PS: I didn't know this before, thanks to Ashot I came to know this difference by experimenting!

Nawaz
  • 353,942
  • 115
  • 666
  • 851
1
 char data_bytes[] = { 0, 0, 1, 1, 0, 0, 3, 3};
  std::string str;
 for(int i =0;i<sizeof(data_bytes);++i)
      str.push_back('0'+data_bytes[i]);
UmmaGumma
  • 5,633
  • 1
  • 31
  • 45
1

Assuming you're using a "fairly normal" system where the numeric values of '0' to '9' are consecutive, you can just iterate over each element and subtract '0':

for(int i = 0; i < header.size(); ++i)
{
    header[i] -= '0';
}
Mark B
  • 95,107
  • 10
  • 109
  • 188
1

You can do this:

std::string header( data_bytes, data_bytes + sizeof( data_bytes ) );
std::transform( header.begin(), header.end(), header.begin(), 
     std::bind1st( std::plus< char >(), '0' ) );
Eugen Constantin Dinca
  • 8,994
  • 2
  • 34
  • 51
0

If integ[] is the integer array, and s is the final string we wish to obtain,

string s="";

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

cout<<s<<endl;
Pe Dro
  • 2,651
  • 3
  • 24
  • 44