tags:

views:

1092

answers:

6

How do I convert a string into an array of integers? Can I use sstream, because atoi doesn't work?!

+3  A: 

How exactly would you like the conversion to work? Do you simply want an array containing the ASCII value of each character in the array? (so "abc" becomes [97, 98, 99, 0])?

Or do you want to parse the string somehow? ("1, 2, 3" becomes an array [1, 2, 3])

In the first case, in C++, I'd do something like this:

struct convert {
  int operator()(char c) {
    return static_cast<int>(c);
  }
};

std::string str = "hello world";
std::vector<int> result;
std::transform(str.begin(), str.end(), std::back_inserter(result), convert())

Of course you could use a raw array instead of the vector, but since the length of the string is probably going to be variable, and then arrays are just asking for trouble.

If this wasn't what you wanted, you might want to edit your question to be more specific.

jalf
+4  A: 

As you said in the comments, you got a binary string and you want to convert it into integers. Use bitset for that:

std::istringstream is(str);
std::bitset<32> bits; // assuming each num is 32 bits long

while(is >> bits) {
    unsigned long number = bits.to_ulong();
    // now, do whatever you want with that long.
    v.push_back(number);
}

If you only have one binary number in that string str, you can get away with

unsigned long number = std::bitset<32>(str).to_ulong();

Converting that in C is also possible...

long value;
char const *c = str;
for(;;) {
    char * endp;
    value = strtol(c, &endp, 2);
    if(endp == c)
        break;

    /* huh, no vector in C. You gotta print it out maybe */
    printf("%d\n", value);
    c = endp;
}

atoi can't parse binary numbers. But strtol can parse them if you tell it the right base.

Johannes Schaub - litb
boost::dynamic_bitset if it's a variable sized length
Greg Rogers
greg, std::bitset takes care of that. it stops at the first whitespace when reading. tho you have to give a max width. but he wants to convert to a integer anyway. so i think setting it to sizeof(long)*CHAR_BIT should do it.
Johannes Schaub - litb
A: 

Quick string splitter routine:

convert(string str, string delim, vector<int>& results)
{
  int next;
  char buf[20];
  while( (next= str.find_first_of(delim)) != str.npos ) {
    if (next> 0) 
      results.push_back(atoi(str.substr(0,next), buf, 10));
    str = str.substr(next+1);
  }
  if(str.length() > 0)
    results.push_back(atoi(str.substr(0,next), buf, 10));
}

You can use stringstream instead of atoi (which does work, on a single int at a time)

int i;
stringstream s (input_string)
s >> i;

If you combine my and jalf's code, you'll get something really good.

gbjbaanb
+1  A: 

From what I understand, for input string "110013" would be converted to array {1,1,0,0,1,3}. Here is how to do it in C++:

string a = "1110011000";
vector<int> v;
for(int i = 0 ; i < a.length() ; i++){
 v.push_back(a[i] -'0');
}

// Check the result
for(int i = 0 ; i < v.size() ; i++){
 cout << v[i] << endl;
}
m3rLinEz
Although this is obvious to experienced C programmers, I might point out that the "trick" is a[i]-'0'. It relies on the fact that ASCII representation of numbers are next to each other, so '0' is NOT 0, but it is guaranteed to always be exactly 1 less than '1'
Bill K
A: 

Use the istream_iterator in conjunction with a string stream.

By Array I am assuming you really mean a std::vector as you don't know the number of integers at compile time. But the code can easily be modified to use an array rather than a vector.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::string     data = "5 6 7 8 9";
    std::vector<int>    store;


    std::stringstream   dataStream(data);
    std::copy(std::istream_iterator<int>(dataStream),
              std::istream_iterator<int>(),
              std::back_inserter(store)
             );

    // This line just copies the store to the std::cout
    // To verify it worked.
    std::copy(store.begin(),
              store.end(),
              std::ostream_iterator<int>(std::cout,",")
             );
}
Martin York
A: 

Language: C

Header:

#include <stdlib.h>

Function Prototype:

long int strtol(const char *nptr, char **endptr, int base);

Example Usage:

strtol(nptr, (char **) NULL, 10);
Chuah