Как лучше всего преобразовать массив строк фиксированной длины в целочисленный массив фиксированной длины в C++?
Это в контексте сериализации ({"AString", "Другой"} -> {{65,102, ...}, {65,78, ...}}? Разбор? ({"0", "2" , "32"} -> {0,2,32}) Дайте дополнительную информацию, пожалуйста.





Это скопирует массив символов в массив целых чисел:
#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 в целые числа и поместит их в массив целых чисел, bar.
Я думаю, он имел в виду массив нить, а не массив символов. Например: char * foo [] = {"Фред", "Джо", "Джим");
Добавлен второй способ скрыть это.
Проголосовал, но лично использовал бы atoi (char *) вместо std :: istringstream.
#include <algorithm>
std::string foo[9];
int bar[9];
std::transform(foo, foo+9, bar, MyMagicStringToIntFunction);
Где MyMagicStringToIntFunction - это та функция, которую вы хотите использовать для преобразования ваших строк в целые числа. Поскольку вы не указали, как вы хотите, чтобы это было сделано, я не могу ответить на эту часть.
Это мое предположение о том, что вы хотите сделать, но будет полезна дополнительная информация. (Под «строковым массивом» вы подразумеваете массив из std :: strings? И как бы вы хотели выполнить преобразование? »
В любом случае, лучше всего подходит std :: transform, но вам придется заполнить пробелы самостоятельно.
Если вы хотите использовать векторы вместо массивов, это может дать вам некоторые идеи.
#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"));
}
Прокрутите массив строк и последовательно преобразуйте каждую строку в соответствующее целое число с помощью 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);
}
Если вы хотите преобразовать массив символов 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-битном типе char со знаком как отрицательное число и в противном случае также будут отрицательными целыми числами). Если вы не хотите этого поведения, вы можете просто безопасно опустить это приведение.
Если вы хотите преобразовать байтовый массив в целочисленный массив, вы можете просто сделать это char за char:
char foo[10];
int bar[10];
for(int i = 0; i < 10; ++i) {
bar[i] = (int)foo[i];
}
Но я полагаю, это не то, что вы ищете ...
Вы имеете в виду «массив символов фиксированной длины в массив целых чисел фиксированной длины»?