Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 12.09.2015
Сообщений: 9
1

Распарсить строку и записать дату рождения в три целочисленные переменные - отдельно день, месяц и год

07.01.2016, 22:48. Показов 4959. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Столкнулся с такой проблемой, дана строка(дата рождения, числа разделены двоеточиями ) ,из нее нужно записать все в переменные день месяц год.
14:11:1997 int dd=14,mm=11,yy=1997;
Может кто подскажет функцию которая делит строку?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2016, 22:48
Ответы с готовыми решениями:

Отдельно дату, месяц, день недели, год, часов, минут, секунд
Всем привет! что то мучаюсь никак не догоню как по отдельности получить из такой строки ...

Заданы день и месяц рождения, а также текущие день, месяц и год. Определить, сколько дней осталось до дня рождения
заданы день и месяц рождения, а также текущие день, месяц и год. Определить, сколько дней осталось...

Ввести дату и разбить ее на три отдельные составляющие: день, месяц и год
1. Ввести дату и разбить ее на три отдельные составляющие: день, месяц и год.

Календарь: записать в переменные выбранные день, месяц, год.
У меня стоит календарь (смотреть в прикреплённом файле). Подскажите, как отдельно записать в...

11
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
07.01.2016, 23:09 2
http://ru.cppreference.com/w/c... sic_string
0
92 / 11 / 10
Регистрация: 09.12.2015
Сообщений: 30
07.01.2016, 23:52 3
даже если вы поделите строку, вам все равно нужно будет сделать преобразование типов. вот, что предлагаю я. не знаю, может кто-нибудь предложит вариант получше моего. p.s если бы у вас вместо двоеточий были пробелы, все бы было проще: сики бы не понадобились
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
 
void main()
{
    string str = "14:11:1997";
    stringstream ss;
    int dd, mm, yy;
    ss << str;
    ss >> dd;
    ss.seekg(3);
    ss >> mm;
    ss.seekg(6);
    ss >> yy;
    cout << dd << endl;
    cout << mm << endl;
    cout << yy << endl;
    system("pause");
 
}
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.01.2016, 01:10 4
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
/*
Столкнулся с такой проблемой, дана строка(дата рождения, числа разделены двоеточиями ) ,
из нее нужно записать все в переменные день месяц год.
14:11:1997 int dd=14,mm=11,yy=1997;
*/
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
///////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        std::cout   <<  "\n\nInput date in format dd:mm:yyyy -> ";
        T_str   date_str;
        getline( std::cin,  date_str );
        size_t  end_ind{};
 
        try
        {
            auto    dd_int  =   stoi    (
                                            date_str,
                                            &end_ind
                                        );
 
            date_str.erase( 0,  ++end_ind );
 
            auto    mm_int  =   stoi    (
                                            date_str,
                                            &end_ind
                                        );
 
            date_str.erase( 0,  ++end_ind );
 
            auto    yy_int  =   stoi    ( date_str );
 
            std::cout   <<  "dd = "
                        <<  dd_int
                        <<  std::endl
 
                        <<  "mm = "
                        <<  mm_int
                        <<  std::endl
 
                        <<  "yy = "
                        <<  yy_int
                        <<  std::endl;
        }
        catch(...)
        {
            std::cout   <<  "String is invalid."
                        <<  std::endl;
        }
    };
}
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
08.01.2016, 03:11 5
Цитата Сообщение от Зи Посмотреть сообщение
p.s если бы у вас вместо двоеточий были пробелы, все бы было проще: сики бы не понадобились
C++
1
2
3
4
5
6
7
 
    ss << str;
    (ss >> dd).get();
    //ss.seekg(3);
    (ss >> mm).get();
    //ss.seekg(6);
    ss >> yy;
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.01.2016, 08:46 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
/*
дана строка(дата рождения, числа разделены двоеточиями) ,
из нее нужно записать все в переменные день месяц год.
14:11:1997 int dd=14,mm=11,yy=1997;
*/
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef std::string                 T_str;
typedef std::vector     < int   >   T_int_values;
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        std::cout   <<  "\n\nInput date in format dd:mm:yyyy -> ";
        T_str   date_str;
        getline( std::cin,  date_str );
        size_t  end_ind{};
 
        try
        {
            T_int_values    int_date_values;
 
            for( int  i = 0; i < 3; ++i )
            {
                int_date_values.push_back
                    (
                        stoi    (
                                    date_str,
                                    &end_ind
                                )
                    );
 
                date_str.erase( 0,  ++end_ind );
            }
 
            std::cout   <<  "dd = "
                        <<  int_date_values[0]
                        <<  std::endl
 
                        <<  "mm = "
                        <<  int_date_values[1]
                        <<  std::endl
 
                        <<  "yy = "
                        <<  int_date_values[2]
                        <<  std::endl;
        }
        catch(...)
        {
            std::cout   <<  "String is invalid."
                        <<  std::endl;
        }
    };
}
Добавлено через 14 минут
Зи, nord_v, ваш вариант плох тем, что если ввести некорректную строку, то программа это никак не определит, а просто выдаст некорректный результат.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
08.01.2016, 09:09 7
Цитата Сообщение от Mr.X Посмотреть сообщение
Зи, nord_v, ваш вариант плох тем, что если ввести некорректную строку, то программа это никак не определит, а просто выдаст некорректный результат.
Согласен, но исхожу из того, что ТС пишет:
Цитата Сообщение от Makeey Посмотреть сообщение
дана строка(дата рождения, числа разделены двоеточиями ) ,из нее нужно записать все в переменные день месяц год.
14:11:1997 int dd=14,mm=11,yy=1997;
Т.е., строка не вводится, а дана в уже определённом формате.
0
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.01.2016, 10:17 8
Ещё можно добавить в локаль потока нужные разделители и читать так же, как если бы там были пробелы.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.01.2016, 11:44 9
Цитата Сообщение от Somebody Посмотреть сообщение
Ещё можно добавить в локаль потока нужные разделители и читать так же, как если бы там были пробелы.
Ну напишите примерчик.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
08.01.2016, 12:09 10
Да можно как угодно извращаться Нужно понимать контекст, какое именно поведение нужно. Например, чтобы выбрать между теми же sscanf и get_time.

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
#include <iostream>
#include <sstream>
#include <string>
#include <locale>
#include <ctime>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
 
int main() {
    std::string input = "1:6:97875657";
    std::tm t {};
#if 0
    if (std::sscanf(input.c_str(), "%d:%d:%d", &t.tm_mday, &t.tm_mon, &t.tm_year) != 3) {
        std::cout << "Fail\n";
        return EXIT_FAILURE;
    }
    --t.tm_mon;
    t.tm_year -= 1900;
#endif
#if 0
    std::istringstream ss(input);
    ss >> std::get_time(&t, "%d:%m:%Y");
    if (ss.fail()) {
        std::cout << "Fail\n";
        return EXIT_FAILURE;
    }
#endif
    std::cout << t.tm_mday << " " << t.tm_mon + 1 << " " << t.tm_year + 1900;
}
0
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.01.2016, 12:12 11
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну напишите примерчик.
Моё дело - предложить идею ) В общем, что-то типа такого (пример внизу):
http://en.cppreference.com/w/cpp/locale/ctype_char
0
0 / 0 / 0
Регистрация: 12.09.2015
Сообщений: 9
08.01.2016, 14:06  [ТС] 12
Спасибо всем огромное, буду сидеть ковыряться дальше
0
08.01.2016, 14:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2016, 14:06
Помогаю со студенческими работами здесь

Даны три натуральных числа обозначают день месяц и год, указать дату предыдущего дня
Даны три натуральных числа обозначают день месяц и год.Указать дату предыдущего дня

Даны три числа: день, месяц, год. Вывести дату предыдущего дня, учитывая особенности високосного года
Даны три числа: D(день),M(число),V(год).Вывести дату предыдущего дня учитывая особенности...

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

Как вывести отдельно дату, месяц и год который сейчас на данный момент?
Я хочу попробовать сделать программу, в которой выполняется следующий алгоритм: 1) Пользователь...

Как вывести дату в формате день.месяц.год. ?
как вывести дату в формате день.месяц.год. ?

Дан список студентов, день, месяц и год рождения каждого из них
Всем добрый день! Кто может помочь написать программу на Delphi или может у кого исходник есть?...


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

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