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

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

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

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

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

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

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

Структура и объединение: дан список студентов. Общие поля: Ф.И.О., группа, домашний номер телефона. Для тех, у кого домашний телефон указать его номер - C++
ЗАДАЧА: Дан список студентов. Общие поля: Ф.И.О., группа, домашний номер телефона. Для тех, у кого домашний телефон указать его номер. Для...

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

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

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

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

7
GoldenId
126 / 124 / 32
Регистрация: 11.11.2010
Сообщений: 699
Записей в блоге: 13
Завершенные тесты: 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, ребятки.
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.03.2013, 05:35 #3
Цитата Сообщение от GoldenId Посмотреть сообщение
то есть, std::regex уже отжил, используйте boost::regex, ребятки.
Boost тем более не входит в стандарт, так что используйте старый-добрый strtok
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 09:32 #4
Задача решается просто, если текст именно такого формата. Всё именно от этого зависит. Даже если есть много таких же записей. Описание формата записи: две строки (или несколько), последнее слово во второй (или в последней) номер телефона. Решение: чтение текста по словам в string (например из строкового потока через cin >>), последнее слово сохраняется (это номер телефона). Дальше (убрать тире) элементарно.
0
RampageTechn
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 6
12.03.2013, 16:09  [ТС] #5
Спасибо большое.
0
GoldenId
126 / 124 / 32
Регистрация: 11.11.2010
Сообщений: 699
Записей в блоге: 13
Завершенные тесты: 1
13.03.2013, 20:57 #6
Ну в том то и дело, alsav22. Скажите, сколько раз за последнюю неделю заказчик Вам говорил: "Ой, а я хочу здесь еще вот такую штучку", и Вам приходилось лопатить тонны кода и перестраивать всю структуру?

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

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

xtorne21st, в своё время так и не справился с установкой boost.
0
alsav22
5421 / 4816 / 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;
}
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 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;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 18:09
Привет! Вот еще темы с ответами:

Получить из строки отдельно фамилию, имя, отчество, возраст и номер телефона - C++
Есть строка (массив типа char), в которой содержится информация о сотруднике: фамилия, имя, отчество, возраст и номер телефона. Как из этой...

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
14.03.2013, 18:09
Ответ Создать тему
Опции темы

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