Форум программистов, компьютерный форум CyberForum.ru

Преобразование строки - C++

Восстановить пароль Регистрация
 
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
22.03.2013, 13:42     Преобразование строки #1
У меня имеется массив string одномерный в каждом элементе этого массива записана строка. Строка начинается с пробела. ex строки: 378 1 384 1 402 1 426 1 474 1 495 1 489 1 522 1 570 1 573. Всё записано через пробел. Мне надо достать эти числа и записать в двумерный массив целых чисел. Двумерный так как строк у меня несколько.
Хотел сделать через формулу:
Заводим переменную целочисленного типа, которая равна первый символ * 10^(n-1) + второй символ * 10^(n-2). Что получится: 1*10 + 2 * 1 = 10 + 2 = 12.
Рассмотрим следующий случай: 3*10^(n-1) + 2*10^(n-2) + 1*10^(n-3) = 3*100 + 2*10 + 1 = 321.
Не вышло.
Как можно сделать такое преобразование наверняка?? Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 13:42     Преобразование строки
Посмотрите здесь:

Преобразование строки в формулу C++
Преобразование строки в double C++
C++ Преобразование строки в целое
C++ Преобразование строки в число
C++ Преобразование строки в число
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
22.03.2013, 15:38     Преобразование строки #2
Дурацкий у вас формат входящей строки.

Первый ноль будет проигнорен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
std::vector<int> stringToVector(const std::string &string) {
  std::vector<int> result;
  result.clear();
  
  int variable = 0;
  for (std::string::const_iterator i = string.begin();
    i != string.end(); ++i) {
    if (*i == ' ') {
      if (variable !=0 || !result.empty()) {
        result.push_back(variable);
        variable = 0;
      }
    } else {
      variable = variable * 10 + *i - '0';
    }
  }
  result.push_back(variable);
  
  return result;
};
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  std::vector<int> numbers = stringToVector(" 378 1 384 1 402 1 426 1 474 1 495 1 489 1 522 1 570 1 573");
  for (size_t i = 0; i < numbers.size(); ++i) {
    std::cout << numbers[i] << " " << std::endl;
  }
 
  return 0;
}
Если можете еще, поменяйте формат входящей строки, чтобы пробел шел ЗА числом.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.03.2013, 15:55     Преобразование строки #3
А так не проще сделать:
C++
1
2
3
4
std::string str = " 378 1 384 1 402 1 426 1 474 1 495 1 489 1 522 1 570 1 573";
std::istringstream iss(str);
std::vector<int> numbers {std::istream_iterator<int>(iss), std::istream_iterator<int>()};
for (int x : numbers) std::cout << x << " ";
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
22.03.2013, 16:40  [ТС]     Преобразование строки #4
Цитата Сообщение от yuron_477 Посмотреть сообщение
А так не проще сделать:
C++
1
2
3
4
std::string str = " 378 1 384 1 402 1 426 1 474 1 495 1 489 1 522 1 570 1 573";
std::istringstream iss(str);
std::vector<int> numbers {std::istream_iterator<int>(iss), std::istream_iterator<int>()};
for (int x : numbers) std::cout << x << " ";
Пример полностью не работоспособен

Добавлено через 2 минуты
а можете сказать, это вы функцию написали?? а то просто я не вижу ключевых слов
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.03.2013, 16:55     Преобразование строки #5
Цитата Сообщение от танкист34 Посмотреть сообщение
Пример полностью не работоспособен
танкист34, вы уверены? А так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
 
int main()
{
    std::string str = " 378 1 384 1 402 1 426 1 474 1 495 1 489 1 522 1 570 1 573";
    std::istringstream iss(str);
    std::vector<int> numbers((std::istream_iterator<int>(iss)), std::istream_iterator<int>());
    for (int i = 0; i<numbers.size(); ++i)
        std::cout << numbers[i] << " ";
 
    return 0;
}
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
22.03.2013, 17:00  [ТС]     Преобразование строки #6
Так работает, спасибо большое. А можете пояснить что это "istringstream" и "istream_iterator" и относятся ли они к заголовочному фалу #include <sstream>?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 17:19     Преобразование строки
Еще ссылки по теме:

Преобразование строки в дробь C++
C++ Выполнить преобразование строки
Преобразование строки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.03.2013, 17:19     Преобразование строки #7
танкист34, забиваете в поиск и ищите, смотрите примеры, заодно в книгу загляните.
Описание istringstream
Yandex
Объявления
22.03.2013, 17:19     Преобразование строки
Ответ Создать тему
Опции темы

Текущее время: 04:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru