Заблокирован
1

Получить числа из строки

15.02.2015, 13:02. Показов 1435. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в строке записаны целые положительные числа (не цифры!) разделенные пробелами (например "5 2 10 8"), требуется спарсить их в std::vector<size_t>, помогите пожалуйста

Добавлено через 1 минуту
з.ы. в случае каких то ошибок (например строка не по формату) можно кинуть какое нибудь исключение

Добавлено через 21 минуту
короче получилось вот так пока что
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::vector<size_t> getnums(const std::string& text, char delimiter)
{
    std::vector<size_t> result;
    for (int i = 0; i < text.size(); i++)
        if (isdigit(text[i]) || text[i] == delimiter)
        {
            if (text[i] == delimiter)
            {
                i++;
                continue;
            }
            char* ptr(nullptr);
            unsigned long d = strtoul(&text[i], &ptr, 10);
            result.push_back(d);
            i += ptr - &text[i];
        }
        else
            throw std::exception("In terms found extraneous characters !");
    return result;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2015, 13:02
Ответы с готовыми решениями:

Получить числа строки
Добрый вечер! Такая проблема есть двумерный массив( который я считал из тxt),например такой adfrgh...

Получить числа из содержимого строки
Имеется переменна типа string, в которую записана следующая строка: &quot;125 123 10 12 14 3 5 8&quot; Как...

Получить числа из строки
есть строка типа: 0,111,0,123,0,333,33,34,33 фактически здесь указаны 6 чисел, которые мне надо...

Получить числа из строки
Здравствуйте. Есть строки типа &quot;12.5%, 17, 18.3кг, 7 Дж,3.2 м&quot;. Единицы измерения могут быть...

14
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
15.02.2015, 13:06 2
Если разделитель - пробел.
C++
1
2
3
4
5
6
7
8
istringstream iss(text);
while (true)
{
    unsigned long d;
    iss >> d;
    if (!iss) break;
    result.push_back(d);
}
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
15.02.2015, 13:06 3
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
#include <cstdio>
#include <vector>
 
using namespace std;
 
const int n = 5;
 
int main() {
    
    vector<size_t> v(n);
    
    for (int i = 0; i < n; ++i) {
        if ((scanf("%d", &v[i])) > 0)
            printf("%d ", v[i]);
        else {
            printf("Error!");
            break;
        }
    }
    
    putchar('\n');
    
    return 0;
}
0
Заблокирован
15.02.2015, 13:08  [ТС] 4
nmcf, Dennis Ritchie, чет ваще не то, где проверка на нужный символ?
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
15.02.2015, 13:09 5
Цитата Сообщение от Feaban Посмотреть сообщение
в случае каких то ошибок (например строка не по формату) можно кинуть какое нибудь исключение
Что вы понимаете под выражением "строка не по формату"?
0
Заблокирован
15.02.2015, 13:18  [ТС] 6
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Что вы понимаете под выражением "строка не по формату"?
то что числа должны быть разделены пробелом (или иным символом который будет передан), если встретилось что то что не число и не этот символ то строка уже не по формату
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
15.02.2015, 13:20 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (true)
{
    unsigned long d;
    iss >> d;
    if (iss.fail() && !iss.eof())
    {
        cout << "Ошибка";
        break;
    }
    if (iss.eof()) break;
    result.push_back(d);
}
0
Заблокирован
15.02.2015, 13:23  [ТС] 8
nmcf, вообще не о чем, вы не понимаете сути, забейте в первом посте я уже привел рабочий код...
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
15.02.2015, 14:11 9
Я не понимаю суть? А ты её понимаешь, применяя арифметику указателей к string?
Проверка на "нужный" символ, т. е. на цифру обеспечивается потоком автоматически, разделители тоже отбрасываются автоматически.
Отличие твоей функции только в том, что delimeter может быть непробельным символом и есть вызов исключения. Я его просто не стал вставлять, ограничившись сообщением об ошибке.
0
Заблокирован
15.02.2015, 15:38  [ТС] 10
Цитата Сообщение от nmcf Посмотреть сообщение
А ты её понимаешь, применяя арифметику указателей к string?
а есть какие то проблемы? я же не как попало применяю, я знаю что делаю и у меня все работает
Цитата Сообщение от nmcf Посмотреть сообщение
Проверка на "нужный" символ, т. е. на цифру обеспечивается потоком автоматически, разделители тоже отбрасываются автоматически.
возможно я что то не знаю об этом классе, не спорю...
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
15.02.2015, 15:45 11
Цитата Сообщение от Feaban Посмотреть сообщение
а есть какие то проблемы?
Получение C-строки из string выполняется через специальную функцию c_str(). Вообще string для того и придуман, чтобы указатели не использовать.
0
Заблокирован
15.02.2015, 15:54  [ТС] 12
Цитата Сообщение от nmcf Посмотреть сообщение
Получение C-строки из string выполняется через специальную функцию c_str().
мне был нужен указатель на конкретный элемент, я его получил, какие проблемы? если бы я стал писать str.c_str() + i это получилось бы длиннее, нафига оно мне надо?
Цитата Сообщение от nmcf Посмотреть сообщение
Вообще string для того и придуман, чтобы указатели не использовать.
в данном случае использование указателей оправдано...
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
15.02.2015, 16:03 13
Цитата Сообщение от Feaban Посмотреть сообщение
оправдано
Но не корректно так, как ты это делаешь.
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
15.02.2015, 16:51 14
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <vector>
#include <stdexcept>
#include <ctype.h>
 
std::vector<size_t>& getnums(std::string str, char const delim, std::vector<size_t>& vec)
{
    try
    {
        for(int i = 0; i < str.size(); ++i)
        {
            if(str[i] != delim && !isdigit(str[i])) throw std::runtime_error(std::string("Character found: ") + str[i]);
            else if(delim == str[i]) str[i] = ' ';
        }
        std::istringstream iss(str);
        vec.assign((std::istream_iterator<size_t>(iss)), std::istream_iterator<size_t>());
    }
    catch(std::exception const& exc)
    {
        throw std::runtime_error(std::string("getnums exception: ") + exc.what());
    }
    return vec;
}
 
int main()
{
    try
    {
        std::string str("45,78,1,45,45");
        char const delim = ',';
        std::vector<size_t> vec;
        getnums(str, delim, vec);
        for(auto val : vec)
        {
            std::cout << val << "  ";
        }
    }
    catch(std::exception const& exc)
    {
        std::cerr << "main exception: " << exc.what() << '\n';
    }
    return 0;
}
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.02.2015, 18:34 15
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
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
 
template <typename T = long long>
std::vector<T> getnums(const std::string& str, const std::string& delim)
{
    std::vector<std::string> num;
    boost::split(num, str, boost::is_any_of(delim), boost::token_compress_on);
    std::vector<T> res;
    for (const std::string& str : num) {
        try {
            res.push_back(std::stoll(str));
        }
        catch(const std::invalid_argument&) {std::cout << "invalid_argument: -> " << str << "\n";}
        catch(const std::out_of_range&) {std::cout << "out_of_range: -> " << str << "\n";}
    }
    return res;
}
 
int main()
{
    std::string str("k45,78, i8, 4* 1;45, 45");
    auto res = getnums<int>(str, " ,;*");
    for(auto val : res) std::cout << val << "  ";
}
Кликните здесь для просмотра всего текста
invalid_argument: -> k45
invalid_argument: -> i8
78 4 1 45 45
0
15.02.2015, 18:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2015, 18:34
Помогаю со студенческими работами здесь

Получить числа из строки
Всем привет. Есть строка: str=&quot;qaws12.9tyu ; tyhd9.2&quot;// ; - разделитель для другого метода, не...

Получить числа из строки
Задача: При вводе например вот таких данных типа стринг&quot;У пастуха было 30 коз, 20 ковор, 50...

Получить числа из строки
Как можно получить отдельно числа из строки BlinkenLights Movie 18x8??? Числа могут принимать...

Даны целые положительные числа N1 и N2 и строки S1 и S2. Получить из строк новую строку, содерж. первые N1 символов строки S1 и последние N2 символов
Даны целые положительные числа N1 и N2 и строки S1 и S2. Получить из этих строк новую строку,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru