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

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

Войти
Регистрация
Восстановить пароль
 
RampageTechn
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 6
#1

Вытянуть номер телефона - C++

11.03.2013, 02:41. Просмотров 829. Ответов 7
Метки нет (Все метки)

Здравствуйте.
У меня есть некоторый текст:
Код
Привет, меня зовут Саша.
Мой номер телефона 050-123-45-67.
Подскажите пожалуйста как можно сначала отсюда вытянуть сам номер телефона : 050-123-45-67
А потом убрать из него тире(чтоб был вот в таком формате) : 0501234567
У меня таких объявлений много надо сделать все в цикле и записывать результат (0501234567) например в массив.
Думаю можно через regexp. Но с ним не очень знаком.
Спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 02:41     Вытянуть номер телефона
Посмотрите здесь:

Номер мобильного телефона - C++
Задан номер мобильного телефона. Определить, какие цифры отсутствуют в этом номере. Входные данные В единственной строке задан...

Класс «Номер телефона», проблема с парой функций - C++
Есть задание (ниже). Я сделал всё из обоих пунктов, но функции Out_All ShowSameCode ShowSameType Find не работают . Никак не могу понять...

Записать в файл номер телефона и сумму разговоров - C++
помогите, пожалуйста, может можно как-то упростить... у меня не получается.. сначала программа открывает исходный файл, считывает из него...

найти номер телефона человека с заданной фамилией - C++
Задали нам задачку в институте.. А препод даже не пришел на лекцию и не рассказал что как.. ПОмогите студенту, пожалуйсто. Операция:...

Вывод на консоль информации о человеке, номер телефона которого введён с консоли - C++
Разработать структуру с именем NOTE, содержащую поля: • Фамилия, имя; • Номер телефона; • Дата рождения (массив их трёх чисел для...

Задан номер мобильного телефона - определить, какие цифры отсутствуют в этом номере - C++
Задан номер мобильного телефона. Определить, какие цифры отсутствуют в этом номере. Помогите!

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GoldenId
125 / 123 / 32
Регистрация: 11.11.2010
Сообщений: 639
Записей в блоге: 12
Завершенные тесты: 1
11.03.2013, 04:24     Вытянуть номер телефона #2
Вот вариант с использованием stl
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
#include <string>
#include <iostream>
#include <regex>
 
using namespace std;
 
int main()
{
    setlocale( LC_ALL, "Russian" );
 
    string inText = "Привет, меня зовут Саша.\n"\
        "Мой номер телефона 050-123-45-67.";
 
    cout << "Входной текст: " << endl << inText << endl;
    regex regex1( "\\d{3}-\\d{3}-\\d{2}-\\d{2}" );
    regex regex2( "-" );
    string empty( "" );
    smatch matches1;
    if( regex_search( inText, matches1, regex1 ) )
        cout << "Извлеченный номер: " <<
            regex_replace( matches1[0].str(), regex2, empty );
    else
        cout << "Совпадений не было найдено";
    cin.get();
}
Написано с Божией и вот и вот помощью.

Добавлено через 6 минут
Вот здесь сказано
std::regex is not supported yet by many compilers (gcc for example). This may cause many problems when you would like to compile your code on computers with different environments than yours. Here you can find C++11 support table This is why I would suggest to you to get familiar with boost::regex.
то есть, std::regex уже отжил, используйте boost::regex, ребятки.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.03.2013, 05:35     Вытянуть номер телефона #3
Цитата Сообщение от GoldenId Посмотреть сообщение
то есть, std::regex уже отжил, используйте boost::regex, ребятки.
Boost тем более не входит в стандарт, так что используйте старый-добрый strtok
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 09:32     Вытянуть номер телефона #4
Задача решается просто, если текст именно такого формата. Всё именно от этого зависит. Даже если есть много таких же записей. Описание формата записи: две строки (или несколько), последнее слово во второй (или в последней) номер телефона. Решение: чтение текста по словам в string (например из строкового потока через cin >>), последнее слово сохраняется (это номер телефона). Дальше (убрать тире) элементарно.
RampageTechn
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 6
12.03.2013, 16:09  [ТС]     Вытянуть номер телефона #5
Спасибо большое.
GoldenId
125 / 123 / 32
Регистрация: 11.11.2010
Сообщений: 639
Записей в блоге: 12
Завершенные тесты: 1
13.03.2013, 20:57     Вытянуть номер телефона #6
Ну в том то и дело, alsav22. Скажите, сколько раз за последнюю неделю заказчик Вам говорил: "Ой, а я хочу здесь еще вот такую штучку", и Вам приходилось лопатить тонны кода и перестраивать всю структуру?

О том и речь, что если номер вдальнейшем уедет в середину текста, у него изменится длина или он попылвёт каким-то другим образом, то регулярные выражения будет приспособить гораздо легче, чем поиск по жестко закодированным параметрам.

Другое дело, что если это студенческая программа на защиту лабораторной, то конечно подключать регулярные выражения смысла нет.

xtorne21st, в своё время так и не справился с установкой boost.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.03.2013, 18:06     Вытянуть номер телефона #7
Нет универсалного кода. Каждый - под какие-то условия. Сложноватое решение я предложил в 4 посте. Можно просто схранить последние 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
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
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
using namespace std;
 
// если между индексами только цифры, то вернёт true
inline bool f(const string &str, int first, int last)
{
    for (int i = first; i < last; i++)
        if (!isdigit((unsigned char)str[i])) return false;
    
    return true;
}
 
// проверка номера на правильность
bool fnamberpar(string &namber)
{
    // 050-123-45-67
    
    int i1 = 3; int i2 = 7; int i3 = 10; // индексы '-'
    const int N = 13; // количество символов
    
    // количество символов, нидексы '-'
    if (namber.size() != N   ||
        namber[i1]    != '-' ||
        namber[i2]    != '-' ||
        namber[i3]    != '-'   ) return false;
 
    // если до тире и после тире только цифры
    if (f(namber,  0,       i1) &&
        f(namber, (i1 + 1), i2) &&
        f(namber, (i2 + 1), i3) &&
        f(namber, (i3 + 1),  N))   
        {
            // удаляем '-'
            namber.erase(i1    , 1);
            namber.erase(i2 - 1, 1);
            namber.erase(i3 - 2, 1);
            
            return true;
        }
    
    else return false;       
 }
 
int main()
{
    // В тексте номер из 13 символов: три цифры, тире
    // три цифры, тире, две цифры, тире, две цифры. Перед номером
    // (если не в начале текста) пробел. После номера - или пробел, или точка.
    
    setlocale(0, "");
    
    string str = "Привет, меня зовут Саша.\n"
    "Мой номер  телефона 050-123-45-67.";
    
    string namber;
    int i, j;
    
    // ищем цифру, если не первая, то перед цифрой должен быть пробел
    for (i = 0; i < str.size(); ++i)
    {
        if ((isdigit((unsigned char)str[0])) ||
           (isdigit((unsigned char)str[i]) && str[i - 1] == ' '))
        {
            // если цифра найдена, то эту цифру и цифры, и тире после неё
            // добавляем в строку номера 
            for (j = i; j < str.size(); j++)
            {
               if (isdigit((unsigned char)str[j]) || str[j] == '-') namber.push_back(str[j]);
               else break; // если встретилась не цифра и не тире
            }
            // если символ не последний в строке, 
            // и после него нет пробела или точки, то продолжаем поиск
            if ((j < str.size()) &&  (str[j] != ' ') && (str[j] != '.'))
            {
                i = j;
                continue;
            }
            // если есть, то проверем номер на правильность
            if (fnamberpar(namber))
            {
                cout << "Номер найден: " << namber << endl;
                break;
            }
            
        }
    }
    
    // если цифра, перед которой пробел (если не первая), не найдена, 
    // или номер не прошёл проверку на правильность
    if (i == str.size()) cout << "Номер не найден" << endl;
    
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 18:09     Вытянуть номер телефона
Еще ссылки по теме:

Найти ищет по имени и адресу номер телефона. Ссылка на неразрешенный внешний символ - C++
Делаю прогу которая ищет по имени и адресу номер телефона, но возникла ошибка. Никак не могу решить эту проблему. Ошибка 2 error...

Описать структуру NOTE, содержащую следующие поля: фамилия, имя, номер телефона - C++
1. Описать структуру NOTE, содержащую следующие поля: фамилия, имя, номер телефона. 2. Написать программу, выполняющую следующие...

Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам - C++
Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам (математика, физика, русский язык,...

Описать структуру FRIEND, содержащую след. поля: Имя, Номер телефона, Дата рождения. С++ - C++
Доброго времени суток, будьте добры, помогите решить задачу. Формулировка: Описать структуру FRIEND, содержащую следующие поля: -Имя...


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

Или воспользуйтесь поиском по форуму:
Ev[G]eN
Эксперт С++
5096 / 1534 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
14.03.2013, 18:09     Вытянуть номер телефона #8
вот как вариант, но действует он если больше не введено никаких цифр. сугубо номер телефона:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <vector>
 
int main ()
{
    std::string string = "Hello, my name is Sasha.\n"\
                         "My telephone number is 050-123-45-67.";
    std::copy(string.begin(), string.end(), std::ostream_iterator <char> (std::cout));
    
    std::vector <int> vector;
    for (unsigned i = 0; i < string.length(); i++)
        if (isdigit(string.at(i)))
            vector.push_back(string.at(i) - '0');
    std::cout << std::endl << "Your number: ";
    std::copy(vector.begin(), vector.end(), std::ostream_iterator <int> (std::cout));
 
    return 0;
}
Yandex
Объявления
14.03.2013, 18:09     Вытянуть номер телефона
Ответ Создать тему
Опции темы

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