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

Ошибка string subcript out of range

23.12.2018, 20:18. Показов 1013. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Есть задача: Создать структуру Hotel, содержащую следующие данные: ФИО туриста, дату прибытия, количество дней пребывания в отеле. Определить людей, находящихся в отеле в заданный день. Необходимо проверить корректность ввода дат. Я пытаюсь ее решить таким способом, но программа прерывается (см.картинку). + предупреждает, что значение возвращается не при всех путях выполнения. Пожалуйста, подскажите мне, где я ошибаюсь.

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
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
struct Hotel {
    string str;
    string name;
    string lastname;
    string patron;
    int day1;
    int month1;
    int year1;
    int kol;
};
bool vis(int y) {//високосный год
     return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);
    
}
 int EndOfMonth(int m, int y) {//конец месяца
     switch (m) {
     case 1: case 3: case 5:
     case 7: case 8: case 10: case 12: return 31;
     case 4: case 6: case 9: case 11: return 30;
     case 2: if (vis(y)) return 29;
     else return 28;
    
     }
    
 }
 bool correct(int d, int m, int y) {
     if (d > 0 && d <= EndOfMonth(m, y) && m > 0 && m <= 12 && y > 0) return true;
     else return false;
 }
int datd(string s) {
    return ((s[0] - 48) * 10 + s[1] - 48);
}
int datm(string s) {
    return ((s[3] - 48) * 10 + s[4] - 48);
        
}
int daty(string s) {
    return ((s[6] - 48) * 1000 + (s[7] - 48) * 100 + (s[8] - 48) * 10 + s[9] - 48);
    
    
}
bool tourist( int d1, int m1, int y1, int k, int d2, int m2, int y2){
    if ((m1 == m2) && (y1==y2) && (d1 + k >= d2)) return true;
    else {
        if ((y1==y1) && ((d1 + k) >> EndOfMonth(m1, y1))) {
            int newd = d1 - EndOfMonth(m1, y1) + k;
            int newm = m1 + 1;
            if ((newm == m2) && (newd >> d2)) return true;
            else return false;
        }
        else {
            if ((m1==12) && ((d1 + k) >> EndOfMonth(m1, y1))) {
                int newd = d1 - EndOfMonth(m1, y1) + k;
                int newm = 1;
                int newy = y1 + 1;
                if ((newm == m2) && (newy == y2) && (newd >> d2)) return true;
            }
            else return false;
        }
    }
}
int main() {
    setlocale(LC_ALL, "rus");
    cout << "Введите интересуемый день ";
    string data;
    getline(cin, data);
    int z = datd(data);
    int b = datm(data);
    int c = daty(data);
    if (correct(z, b, c) == false)
        cout << "Некорректная дата\n";
    else {
        int numPeople;
        cout << "Введите количество туристов ";
        cin >> numPeople;
        string zdec;
        vector<Hotel> a;
        Hotel People;
        for (int i = 0; i < numPeople; i++) {
            a.push_back(People);
            cout << "Введите ФИО ";
            cin >> a[i].name;
            cin >> a[i].lastname;
            cin >> a[i].patron;
            cout << "Введите количество дней пребывания ";
            cin >> a[i].kol;
            cout << "Введите дату прибытия";
            getline(cin, a[i].str);
            a[i].day1 = (datd(a[i].str));
            a[i].month1 = (datm(a[i].str));
            a[i].year1 = (daty(a[i].str));
            if (correct(a[i].day1, a[i].month1, a[i].year1) == false)  cout << "Некорректная дата\n";
            else if (tourist(a[i].day1, a[i].month1, a[i].year1, a[i].kol, z, b, c) == true) zdec = zdec + ", " + a[i].name + a[i].lastname + a[i].patron;
        }
        cout << zdec;
        return 0;
    }
}
Миниатюры
Ошибка string subcript out of range   Ошибка string subcript out of range  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2018, 20:18
Ответы с готовыми решениями:

Ошибка string subscript out of range
Нужно заменить символ 'w' на 'v'. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt;...

Ошибка: String subscript out of range
Expression: String subscript out of range Консольное приложение. Программа должна перерабатывать...

Ошибка string subscript out of range
Здраствуйте создал библиотеку, при подключение библиотеки и запуска программи все работает...

Ошибка: string subscript out of range
При запуске выдает ошибку &quot;string subscript out of range&quot;. Подскажите, в чем проблема. #include...

4
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
23.12.2018, 22:03 2
Если ты не заполняешь дату корректно, то функции datd и тд пытаются обратиться к данным в памяти, которых нет, по сути тоже самое если ты обращаешься к элементы массива которого нет, в итоге вылетает ошибка

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
setlocale(LC_ALL, "rus");
    string data;
 
    while (data.size() < 10)
    {
        cout << "Введите интересуемый день ";
        getline(cin, data);
        if (data.size() < 10)
        {
            cout << "Некорректная дата" << endl;
        }
    }
        
    int z = datd(data);
    int b = datm(data);
    int c = daty(data);
Попробуй так, но формат должен быть всегда не меньше 10 символов (08,08,2017)

Добавлено через 10 минут
C++
1
while (data.size() != 10)
Добавлено через 14 минут
Нашел
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int i = 0; i < numPeople; i++) {
            a.push_back(People);
            cout << "Введите ФИО ";
            cin >> a[i].name;
            cin >> a[i].lastname;
            cin >> a[i].patron;
            cout << "Введите количество дней пребывания ";
            cin >> a[i].kol;
            cout << "Введите дату прибытия";
            cin.ignore();                       //Дата вводится из предыдущего ввода и проскакивает
            getline(cin, a[i].str);
            a[i].day1 = (datd(a[i].str));
            a[i].month1 = (datm(a[i].str));
            a[i].year1 = (daty(a[i].str));
            if (correct(a[i].day1, a[i].month1, a[i].year1) == false)  cout << "Некорректная дата\n";
            else if (tourist(a[i].day1, a[i].month1, a[i].year1, a[i].kol, z, b, c) == true) zdec = zdec + ", " + a[i].name + a[i].lastname + a[i].patron;
        }
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 7
23.12.2018, 22:36  [ТС] 3
Спасибо вам огромное! Действительно помогло. Но теперь другая проблема: вывод имени туриста не кириллицей, а краказябрами. Почему так? Ведь setlocale прописан
0
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
23.12.2018, 22:44 4
Попробуй вместо setlocale
C++
1
system("chcp 1251 >>null");
1
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 7
23.12.2018, 22:47  [ТС] 5
Ура, спасибо!
0
23.12.2018, 22:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2018, 22:47
Помогаю со студенческими работами здесь

Ошибка String subscript out of range
Здравствуйте. Написал на Dev C++ 4.9.9.2 программу которая открывает фаил и кладет все в буфер....

Ошибка Expression: string subscript out of range
1)Вывести сообщение &quot;МОЖНО&quot;, если из букв введённой строки X можно составить введенную строку Y,...

Ошибка expression string subscript out of range
Ребят, уже всю голову разбил... не пойму где здесь может быть ошибка, что я не так сделал????...

Ошибка при быстрой сортировке файла: "string subscript out of range"
В файле input.txt содержатся сведения о группе студентов в формате: номер группы; запись о каждом...


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

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