Массивы C++: преобразование содержащегося типа

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

Вы имеете в виду «массив символов фиксированной длины в массив целых чисел фиксированной длины»?

LeppyR64 12.11.2008 17:08

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

xtofl 12.11.2008 17:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
720
5

Ответы 5

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

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

std :: copy

Это присваивает значения массива символов с завершающим нулем {'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>);

std :: transform

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

Я думаю, он имел в виду массив нить, а не массив символов. Например: char * foo [] = {"Фред", "Джо", "Джим");

T.E.D. 12.11.2008 17:40

Добавлен второй способ скрыть это.

luke 12.11.2008 17:45

Проголосовал, но лично использовал бы atoi (char *) вместо std :: istringstream.

Max Lybbert 12.11.2008 23:02
#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"));
}

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

Прокрутите массив строк и последовательно преобразуйте каждую строку в соответствующее целое число с помощью 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

Если вы хотите преобразовать массив символов 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];
}

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

Другие вопросы по теме