Как мне преобразовать строку в C ++ или C в целочисленный массив? - PullRequest
0 голосов
/ 31 декабря 2008

Как мне преобразовать строку в массив целых чисел? Могу ли я использовать sstream, потому что atoi не работает?!

Ответы [ 6 ]

4 голосов
/ 31 декабря 2008

Как вы сказали в комментариях, вы получили двоичную строку и хотите преобразовать ее в целые числа. Для этого используйте bitset:

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

Если у вас есть только одно двоичное число в этой строке str, вы можете сойти с

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

Преобразование этого в C также возможно ...

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 не может разобрать двоичные числа. Но strtol может их проанализировать, если вы укажете правильную базу.

3 голосов
/ 31 декабря 2008

Как именно вы хотите, чтобы преобразование работало? Вы просто хотите массив, содержащий значение ASCII каждого символа в массиве? (поэтому «abc» становится [97, 98, 99, 0])?

Или вы хотите как-то разобрать строку? («1, 2, 3» становится массивом [1, 2, 3])

В первом случае в C ++ я бы сделал что-то вроде этого:

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())

Конечно, вы можете использовать необработанный массив вместо вектора, но, поскольку длина строки, вероятно, будет переменной, и тогда массивы просто будут вызывать проблемы.

Если это не то, что вы хотели, вы можете отредактировать свой вопрос, чтобы он был более конкретным.

1 голос
/ 31 декабря 2008

Насколько я понимаю, для входной строки "110013" будет преобразовано в массив {1,1,0,0,1,3}. Вот как это сделать в 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;
}
0 голосов
/ 01 января 2009

Язык: C

Заголовок:

#include <stdlib.h>

Прототип функции:

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

Пример использования:

strtol(nptr, (char **) NULL, 10);
0 голосов
/ 31 декабря 2008

Используйте istream_iterator в сочетании с потоком строк.

Под массивом я предполагаю, что вы действительно имеете в виду std :: 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,",")
             );
}
0 голосов
/ 31 декабря 2008

Быстрый разделитель строк:

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

Вы можете использовать stringstream вместо atoi (который работает, по одному int за раз)

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

Если вы объедините код my и jalf, вы получите что-то действительно хорошее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...