C ++ Arrays: преобразование содержимого типа - PullRequest
2 голосов
/ 12 ноября 2008

Каков наилучший способ преобразования массива строк фиксированной длины в массив целочисленных значений длины в С ++?

Ответы [ 5 ]

10 голосов
/ 12 ноября 2008

Это скопирует массив символов в массив целых:

#include <algorithm>
char foo[9] = "asdfasdf";
int bar[9];
std::copy(foo, foo+9, bar);

станд :: копия

Это присваивает значения массиву символов с нулем в конце {'a', 's', 'd', 'f', 'a', 's', 'd', 'f', '\ 0' } в массив целых чисел, что дает {97, 115, 100, 102, 97, 115, 100, 102, 0}. Обратите внимание, что это включает нулевое завершение исходной строки.


Это проанализирует массив строк и поместит их целочисленные значения в массив целых чисел:

#include <algorithm>
#include <sstream>
#include <string>

template <class T>
T parse(const std::string& str)
{
    T temp;
    std::istringstream iss(str);
    iss >> temp;
    if(iss.bad() || iss.fail())
    {
        // handle conversion failure
    }
    return temp;
}

...

std::string foo[3];
int bar[3];
foo[0] = "67";
foo[1] = "11";
foo[2] = "42";

std::transform(foo, foo+3, bar, parse<int>);

станд :: преобразование

Это преобразует каждую из строк в массиве foo в целые, и помещает их в массив целых, бар.

6 голосов
/ 12 ноября 2008
#include <algorithm>

std::string foo[9];
int bar[9];

std::transform(foo, foo+9, bar, MyMagicStringToIntFunction);

Где MyMagicStringToIntFunction - это функция, которую вы хотите использовать для преобразования ваших строк в целые числа. Поскольку вы не указали, как вы хотели, чтобы это было сделано, я не могу ответить на эту часть.

Это мое предположение о том, что вы хотите сделать, но было бы полезно получить дополнительную информацию. (Под «строковым массивом подразумевается массив std :: strings? И как бы вы хотели выполнить преобразование?»

В любом случае, std :: transform - мой лучший вариант, но вам придется заполнить пробелы самостоятельно.

2 голосов
/ 12 ноября 2008

строковый массив -> int array

Зацикливайте массив строк и последовательно конвертируйте каждую строку в соответствующее целое число, используя std::istringstream

std::size_t const N = 3;
std::string a[N] = { "10", "-2", "5" };
int b[N];

for(std::size_t i = 0; i < N; i++) {
    std::istringstream sstream(a[i]);
    sstream >> b[i];
}

Если у вас много значений, постоянное воссоздание струнного потока может привести к значительным накладным расходам. Вы можете вытащить его из цикла.

std::stringstream sstream;
for(std::size_t i = 0; i < N; i++) {
    sstream << a[i];
    sstream >> b[i];
    sstream.clear(); 
    sstream.seekp(0); sstream.seekg(0);
}

массив символов -> массив int

Если вы хотите преобразовать массив char a в массив int b, вы можете сделать это следующим образом:

std::size_t const N = 15;
char a[N] = { "this is a test" };
int b[N];

for(std::size_t i = 0; i < N; i++)
    b[i] = (int)(unsigned char) a[i];

Приведение к unsigned char делает значения массива int положительными (полезно, если вы хотите преобразовать расширенные 8-битные символы, которые будут представлены в 8-битном типе со знаком со знаком, как отрицательное число и в противном случае также будут отрицательными целыми числами) , Если вы не хотите этого поведения, вы можете просто опустить этот бросок безопасно.

0 голосов
/ 12 ноября 2008

Если вы хотите преобразовать байтовый массив в целочисленный массив, вы можете просто сделать это char на char:

char foo[10];
int bar[10];

for(int i = 0; i < 10; ++i) {
  bar[i] = (int)foo[i];
}

Но я предполагаю, что это не то, что вы ищете ...

0 голосов
/ 12 ноября 2008

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

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <ostream>
#include <algorithm>
#include <sstream>
using namespace std;

int int_from_string(const string& s) {
    istringstream ss(s);
    int i;
    ss >> i;
    return i;
}

vector<int> int_vec_from_string_vec(const vector<string>& vstr) {
    vector<int> v(vstr.size());
    transform(vstr.begin(), vstr.end(), v.begin(), int_from_string);
    return v;
}

int main() {
    const vector<string> vstr(3, "45");
    const vector<int> vint = int_vec_from_string_vec(vstr);
    copy(vint.begin(), vint.end(), ostream_iterator<int>(cout, "\n"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...