Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

Как извлечь только цифры из строки - C++

07.10.2013, 00:31. Просмотров 1653. Ответов 16
Метки нет (Все метки)

Есть файл и в нем строки вида 00:00:00,000 --> 00:00:00,200
Нужно извлечь только цифры из каждой такой строки и одну часть с цифрами до "-->" в int переменную1, а другую часть с цифрами после "-->" в int переменную2, потом сложить с другими значениями, которые вводятся из консоли и обратно вставить/преобразовать в строку, чтобы получился изначальный вид, но уже с результатом вычислений, к примеру 00:01:20,404 --> 02:01:09,271
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2013, 00:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как извлечь только цифры из строки (C++):

Как считать только цифры из строки? - C++
Здравствуйте! Есть строка с различными символами (например "sd712hpq34"), нужно считать только числа из этой строки в int переменную (т.е....

Как из строки выбрать только цифры - C++
Подскажите пожалуйста,как из строки выбрать только цифры,а потом их сложить??! То есть есть некая строка "123asd" нужно чтобы получилось...

Из строки извлечь символы операций в стек, а цифры - в другую строку - C++
Из исходной строки необходимо извлечь символы операций и поместить в стек а цифры в другую строку... но вот ошибка... Вот код:const int max...

Из заданной строки получить только цифры - C++
В какой то строке цифры с перемешкой буквами. Из строки надо взять только цифры. Пример: dcfgvbhjn123456 Вывод: 123 456. Надо...

При вводе строки выводить только цифры - C++
#include "stdafx.h" #include "stdio.h" #include "iostream" #include "ctype.h" using namespace std; void read(char *x) { int i...

строки.В заданный непустой текст входят только цифры. Определить: - C++
Текст является восьмеричной записью числа, кратного 5. как написать поиск цифры 8? и определение того, оканчивается ли число на 0 или 5.

16
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.10.2013, 00:48 #2
mzarb, Ну и что ты будешь вычислять? Распиши хоть.

Добавлено через 1 минуту
От у тебя строка есть "00:01:20,404 --> 02:01:09,271", что ты с чем слаживаешь? Какая часть записывается в int1 а кокая в int 2?????
0
Чумаков Антон
85 / 67 / 17
Регистрация: 07.03.2011
Сообщений: 169
07.10.2013, 00:51 #3
А если посимвольно сравнивать строку с образцами в блоке switch-case, выделяя из неё только цифры и пропуская всякие двоеточия и стрелки. Выделенные же цифры прибавлять к новой строке, которую потом можно преобразовать в int функцией atoi().
Со второй частью сделать то же самое, определив только, что перескочили через "-->".
Обратно преобразовать int в строку можно с помощью функции itoa(), куда потом можно натолкать все двоеточия и стрелки.
1
Yanush
159 / 156 / 46
Регистрация: 28.09.2013
Сообщений: 288
Завершенные тесты: 1
07.10.2013, 01:37 #4
Проходи циклом по строке, пока не дойдешь до разделителя (-->, можно его сделать покороче, чтобы не париться, например |). Если str[i] >= '0' && str[i] <= '9' то это число и делай с ним, что тебе нужно. А дальше ещё раз пройдись циклом (с позиции разделителя +1, или как-то так) уже до конца строки с такими же действиями. Дальше умножаешь/делаешь что тебе нужно и printf в строку.
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
07.10.2013, 01:41  [ТС] #5
Цитата Сообщение от ninja2 Посмотреть сообщение
mzarb, Ну и что ты будешь вычислять? Распиши хоть.
Вообщем пишу для себя программу, которая будет делать смещение по времени в файлах субтитров. То есть, бывает скачаю сериал, а там в начале реклама ресурса или что-то ещё и из-за этого субтитры начинаются раньше чем слова им соответствующие. Может и есть такая программа или это и без программы решается в плеере каком-то, но мне хотелось сделать именно самому, так как думал быстро получится, но что-то затянулось и получился плохой код с велосипедами и кучей багов, при решении которых появлялись новые. Вообщем вот весь код(запускал в win7 msvc++ 2008, хотя запускать нет смысла, так как много вариантов тестил и сейчас оставил один для понимания того, что я хотел, так вот проблемы начинаются внутри проверок инкреса и дикреса, потому что не смог придумать вменяемый алгоритм сложения и вычитания с помощью того способа), если интересно, но лучше не тратить время и нервы.
Добавлено через 1 минуту
От у тебя строка есть "00:01:20,404 --> 02:01:09,271", что ты с чем слаживаешь? Какая часть записывается в int1 а кокая в int 2?????
000120404 в int1 и 020109271 в int2, а ввод будет в виде времени на которое нужно увеличить или уменьшить, к примеру хочу увеличить на 500 миллисекунд и пишу в консоль 00:00:00,404, потом это значение попадает в строку и дальше из неё извлекаются цифры и записываются в инт переменную и это будет допустим 000000500, так вот если перед этим был выбран режим увеличения, то это число 000000500 будет сложенно с 000120404 и потом результат 000120904 преобразован в строку 00:01:20,404. Так вот как это сделать? А все остальное уже не проблема.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,672
Записей в блоге: 5
07.10.2013, 03:04 #6
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <string>
#include <strstream>
#include <Windows.h>
using namespace std;
 
struct Nubers_group{
public:
Nubers_group();
Nubers_group(string src);
Nubers_group(const Nubers_group &orig);
void show();
    int first;
    int second;
    string sorce;
    
    static char delims[];
};
char Nubers_group::delims[]={':',',',' '};
Nubers_group::
Nubers_group(){
first=0;
second=0;
sorce="";
}
Nubers_group::
Nubers_group(string src){
first=0;
second=0;
sorce=src;
}
Nubers_group::
Nubers_group(const Nubers_group &orig){
    if (this != &orig){
first=orig.first;
second=orig.second;
sorce=orig.sorce;
    }
}
void
Nubers_group::
show(){
cout<<"\nObject\n";
cout<<sorce<<endl;
cout<<first<<endl;
cout<<second<<endl<<endl;
}
//-----------end_of_class_deffinition--------------
 
void extrct_numbers(string a_str, int &first, int &second){
strstream str_stream;
str_stream << a_str;
string tmp_str_one;
string tmp_str_two;
string tmp_str;
cout<<"extrcting first"<<endl;
getline(str_stream, tmp_str, Nubers_group::delims[0]);//12:
tmp_str_one=tmp_str;
cout<<tmp_str_one<<endl;
 
getline(str_stream, tmp_str, Nubers_group::delims[0]);//34:
tmp_str_one += tmp_str;
cout<<tmp_str_one<<endl;
 
getline(str_stream, tmp_str, Nubers_group::delims[1]);//56,
tmp_str_one += tmp_str;
cout<<tmp_str_one<<endl;
 
getline(str_stream, tmp_str, Nubers_group::delims[2]);//789_
tmp_str_one += tmp_str;
cout<<tmp_str_one<<endl;
first = atoi(tmp_str_one.c_str());
 
getline(str_stream, tmp_str, Nubers_group::delims[2]);// -->_ 
 
cout<<"extrcting second"<<endl;
 
getline(str_stream, tmp_str, Nubers_group::delims[0]);//98:
tmp_str_one=tmp_str;
cout<<tmp_str_one<<endl;
 
getline(str_stream, tmp_str, Nubers_group::delims[0]);//76:
tmp_str_one += tmp_str;
cout<<tmp_str_one<<endl;
 
getline(str_stream, tmp_str, Nubers_group::delims[1]);//54,
tmp_str_one += tmp_str;
cout<<tmp_str_one<<endl;
 
getline(str_stream, tmp_str);//321
tmp_str_one += tmp_str;
cout<<tmp_str_one<<endl;
second = atoi(tmp_str_one.c_str());
}
 
 
int main()
{
SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
string a_str = "12:34:56,789 --> 98:76:54,321";
Nubers_group obj(a_str);
int first(0), second(0);
extrct_numbers(a_str, first, second);
obj.first = first;
obj.second = second;
obj.show();
    system("pause"); 
    return 0;
    }
Назад в строку уж сами переведите. Это не сложно.
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.10.2013, 03:21 #7
Ну от еще как вариант с переводом в строку.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <regex>
#include <sstream>
#include <string>
#include <algorithm>
using namespace::std;
 
int main()
{
    std::string str="00:01:20,404 --> 02:01:09,271";
    cout <<"str= "<<str<<endl;
 
    std::regex rv("^([^:]*?):([^:]*?):([^,]*?),([^ ]*?) --> ([^:]*?):([^:]*?):([^,]*?),(.*?)$");
    std::smatch sm;
    if(std::regex_search(str,sm,rv))
    {
        string s1,s2;
        int int1,int2;
        int n(500);
        s1+=sm[1].str()+sm[2].str()+sm[3].str()+sm[4].str();
        s2+=sm[5].str()+sm[6].str()+sm[7].str()+sm[8].str();
 
        stringstream ss;
        ss<<s1; ss>>int1;
        ss.clear();
        ss<<s2; ss>>int2;
 
        int1+=n;
 
        ss.clear(); ss<<int1; ss>>s1;
        ss.clear(); ss<<int2; ss>>s2;
 
        //преобразовываем в строку
        string sss1,sss2;
        for(int i=0;i<9;i++)
        {
            if(s1.size()!=0)
            {
                sss1.push_back(s1.back());
                s1.pop_back();
            }
            else
            {
                sss1.push_back('0');
            }
            //00:01:20,404 --> 02:01:09,271
            if(i==2) sss1.push_back(',');
            else if(i==4||i==6)sss1.push_back(':');
        }
 
        for(int i=0;i<9;i++)
        {
            if(s2.size()!=0)
            {
                sss2.push_back(s2.back());
                s2.pop_back();
            }
            else
            {
                sss2.push_back('0');
            }
            //00:01:20,404 --> 02:01:09,271
            if(i==2) sss2.push_back(',');
            else if(i==4||i==6)sss2.push_back(':');
        }
 
        reverse(sss1.begin(),sss1.end());
        reverse(sss2.begin(),sss2.end());
        
        str=sss1+" --> "+sss2;
        cout <<"str= "<<str<<endl;
    }
 
    return 0;
}
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,672
Записей в блоге: 5
07.10.2013, 03:35 #8
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну от еще как вариант с переводом в строку.
Моя восьмёрка 11 не держит. В шарпе можно, а плюсиках нет. Поставить внешнюю вроде boost?
Ну и вручную логика прозрачней. Для ТС. Там компактнее всё можно бы, но я специально по шагам и с выводом сделал, так как не вник что и как, а пояснения на тот момент ещё не видел.
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.10.2013, 03:39 #9
Цитата Сообщение от IGPIGP Посмотреть сообщение
Поставить внешнюю вроде boost?
Хз. мб. я буст не знаю, <regex> прикольная библиотека, можно любой текст выдрать, щас парсер пишу html, уже натренировался могу любое РВ написать. Наоборот мб с РВ дольше работает, да дольше 100%, еще смотря как РВ написать, можно так написать что оно будет искать очень долго, а может и бесконечно.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,672
Записей в блоге: 5
07.10.2013, 12:47 #10
Цитата Сообщение от ninja2 Посмотреть сообщение
Хз. мб. я буст не знаю, <regex> прикольная библиотека,
Мощная вещь, что и говорить. Готовое решение для человека который не рубит сгодится, но если нужная в реализации логика чуть поменяется, то придётся ему помучиться. Хотя без пруда не вытащишь и рыбку, это - да...


Добавлено через 8 часов 54 минуты
ninja2, что-то большое у меня вчера вышло. Может так ровнее:
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
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
//Ах что такое движется там по pеке? 
//----------------------------
//Ах не солгали пpедчувствия мне
//Да мне глаза не солгали
//Лебедем белым скользя по волне
//Плавно навстpечу идёт РОВ-НО-КОД))) 
string find_number(string a_str, int &found_pos){
const char *sumbols = "0123456789";
const int len_of_num = 9;
char buf[len_of_num+1] ={'\0'};
int found = a_str.find_first_of(sumbols,found_pos); 
buf[0] = a_str[found];
for (int i = 1; i < len_of_num; ++i){
found = a_str.find_first_of(sumbols,found+1);
buf[i] = a_str[found];
}
found_pos=found+1;
return string(buf);
}
 
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
string a_str = "#&*12:34:56,789 --> 48:76:54,321";
int found_pos = 0;
 
cout<<atoi(find_number(a_str, found_pos).c_str())<<endl;
cout<<atoi(find_number(a_str, found_pos).c_str())<<endl;
system("pause"); 
    return 0;
    }
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
08.10.2013, 00:33  [ТС] #11
ninja2
С регулярными выражениями планировал позже познакомится).
Цитата Сообщение от IGPIGP Посмотреть сообщение
Назад в строку уж сами переведите. Это не сложно.
Да. Спасибо!
Цитата Сообщение от IGPIGP Посмотреть сообщение
что-то большое у меня вчера вышло. Может так ровнее:
Мне оба варианта понравились).

Не по теме:

А как atoi расшифровывается? array to int ?

0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,672
Записей в блоге: 5
08.10.2013, 01:00 #12
Цитата Сообщение от mzarb Посмотреть сообщение
Да. Спасибо!
Мне оба варианта понравились).

Не по теме:

А как atoi расшифровывается? array to int ?

Не за что. Это функция пришедшая из Си:
Нужны описания всех функций
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
08.10.2013, 01:13  [ТС] #13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Расшифровка названий функций си!
Там же только ссылки на главные страницы). Пробежался и не нашел расшифровок.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,672
Записей в блоге: 5
08.10.2013, 01:17 #14
Цитата Сообщение от mzarb Посмотреть сообщение
Пробежался и не нашел расшифровок.
Там в самом вопросе вариант расшифровки: ACSCII string to Integer. Я честно говоря и сам не уверен ASCII или ANSI. Может и уточнит кто.
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
13.10.2013, 14:12  [ТС] #15
IGPIGP, Могли бы вы ещё по одной проблеме подсказать?
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
#define min(a,b)                (((a) < (b)) ? (a) : (b))
#define max(a,b)                (((a) > (b)) ? (a) : (b))
#define find_nums(a)            atoi(find_number((a), found_pos).c_str()) 
#define change_nums(a)          status ? min((a) + newtime, 999999999) : max((a) - newtime, 0)
 
int newtime = 555555555;
 
string find_number(string a_str, int &found_pos){
    const char *sumbols = "0123456789";
    const int len_of_num = 9;
    char buf[len_of_num+1] ={'\0'};
    int found = a_str.find_first_of(sumbols,found_pos); 
    buf[0] = a_str[found];
    for (int i = 1; i < len_of_num; ++i){
        found = a_str.find_first_of(sumbols,found+1);
        buf[i] = a_str[found];
    }
    found_pos=found+1;
    return string(buf);
}
 
while(getline(fobj, str_file))
{
    std::size_t found = str_file.find("-->");
    if(found != std::string::npos) {
        int found_pos = 0;
        int i1 = find_nums(str_file);
        i1 = change_nums(i1);
        int i2 = change_nums(find_nums(str_file));
}
В 28 и 29 строчке код работает нормально, но если объединить это в одну строчку, как во втором варианте с i2 на 30 строчке, то значением i2 будет просто значение newtime, как будто просто написано i2 = newtime. Так почему же раздельное объявление и определение работает, а если вместе, то нет?
0
13.10.2013, 14:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2013, 14:12
Привет! Вот еще темы с ответами:

Как извлечь числа из строки - C++
Предположим что есть такое выражение и оно записано в блокноте (100;200) , Как извлечь из текстового документа 2 числа 100 и 200? понимаю...

Дан текстовый файл. Извлечь из файла цифры записать их в массив - C++
Дан текстовый файл . В файле находятся строки 5-6 строк . В каждой строке есть цифры . Извлечь из файла цифры записать их в массив...

Сформировать две строки - первая содержит только числа из исходной строки, а вторая – только слова - C++
1.Дан текст, состоящий из предложений. Ввод текста осуществляется в несколько строк (не более 20). Признак завершения ввода – ввод пустой...

Извлечь из string только разные буквы - C++
Здравствуйте, вообще не могу додуматься, как извлечь из string только разные буквы. Скажем, у нас есть string str = &quot;мама&quot;, из него мне...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru