Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58

Надо найти ошибку. С++. Не обрабатывает

11.05.2019, 15:16. Показов 1825. Ответов 38

Студворк — интернет-сервис помощи студентам
Программа ищет и выводит на экран строки из файла, которые удовлетворяют запросу.
Выдает такое предупреждение, если в файле нашлось несколько совпадений:
"Возникло необработанное исключение по адресу 0x771018A2 в prog.exe: исключение Microsoft C++: std::out_of_range по адресу памяти 0x00CFF910."


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
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    vector<string> mas_str;
    system("chcp 1251");
    system("cls");
 
    fstream tests;
    string dop;
    int counter = 0;
    tests.open("file.txt", ios::in);
 
    do{
        getline(tests, dop);
        counter++;
        mas_str.push_back(dop);
    } while (!tests.eof());
 
    for (int i = 0; i < mas_str.size(); i++)
    {
        cout << mas_str[i] << endl;
    }
 
    string search;
    int result_numb = 0;
    int flag1 = 0;
    int flag2 = 0;
    int length_of_search = 0;
    cout << "введите поиск  ";
    getline(cin, search);
    length_of_search = search.size();
 
    
        for (int i = 0; i < mas_str.size(); i ++)
        {
            result_numb = mas_str[i].compare(3, length_of_search, search); /* Т.к. поиск идет по фамилии, а она в строках стоит после 3х пробелов от начала строки, я написал такое условие. Делал через compare, а не через find, чтобы искал только по заданному диапазону. С 4-й позиции и до конца длины слова из поискового запроса. Чтобы дальше по строке он уше не проверял. Чтобы, если в другой графе ( не фамилия, а к примеру в адресе ) встретится слово из поискового запроса, то на печать бы вышли только варианты, где фамилия нашлась именно в графе фамилий. */
            if ((result_numb == 0)&&(flag1 == 0)) {
                cout << "Найдены совпадения" << endl << endl;
                cout << mas_str[i] << endl;
                flag1 = 1;
                flag2 = 1;
            } else
                if ((result_numb == 0) && (flag1 == 1)) {
                    cout << mas_str[i] << endl;
                    flag2 = 1;
                }
            
            
        }cout << endl;
        if ((result_numb != 0)&& (flag2 == 0)) {
            cout << endl;
            cout << "Совпадений нет" << endl;
            cout << endl;
        }
    
 
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2019, 15:16
Ответы с готовыми решениями:

Надо найти ошибку
Всем привет! Вот задали задачку, решаю, а не выходит точно, можно сказать вообще не правильно считает( Такая вот задачка: Написать...

надо найти ошибку
program ZADACA2_1; uses crt; var H:text; P,Pn,Pk,hP:integer; V,Vn,Vk,hV:real; T,Tn,Tk,hT:integer; L,Ln,Lk,hL:integer; ...

Надо найти ошибку...
Добрый день, дорогие программисты! Пишу курсач &quot;Преломление/отражение света в воде, стекле, масле&quot; - строю ход лучей, не могу найти...

38
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
11.05.2019, 23:13
Студворк — интернет-сервис помощи студентам
MikaSan, если сам составлял файл то лучше переформатируй на манеру JSON или не "|" а допустим точкойс запятой или \t через банальный .split

Добавлено через 5 минут
тогда ошибки с ренжом практически не будет
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 00:30  [ТС]
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, если сам составлял файл то лучше переформатируй на манеру JSON или не "|" а допустим точкойс запятой или \t через банальный .split

Добавлено через 5 минут
тогда ошибки с ренжом практически не будет
В результате я просто переписал алгоритм по другому, используя другую функцию. В общем, я не смог разобраться с ренджом.
Что вообще этот рендж из себя представляет и что делает?
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 12:29
MikaSan, да особо нечего, это так сказать условное понятие в данной ошибки. смотри
C++ (Qt)
1
2
3
4
5
6
7
8
9
 // есть строка 
std:string x = "some text";
// если попросим ее длинну посчитать то получим
qDebug (x.size); // 9
// если обратится по адресу все ок. Точнее фигня но не ощибка
qDebub (x[11]);
// а вот если функцией обратится через функцию
qDebub (x.substr(11, "x"));
// получим как раз ошибку выход за рамки массива, то есть тут функция умнее обычного [] там тоже должна быть ошибка ренжа
Но это прям совсем на пальцах не говоря о тебе памяти и все из этого вытекающего
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 13:27  [ТС]
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, да особо нечего, это так сказать условное понятие в данной ошибки. смотри
C++ (Qt)
1
2
3
4
5
6
7
8
9
 // есть строка 
std:string x = "some text";
// если попросим ее длинну посчитать то получим
qDebug (x.size); // 9
// если обратится по адресу все ок. Точнее фигня но не ощибка
qDebub (x[11]);
// а вот если функцией обратится через функцию
qDebub (x.substr(11, "x"));
// получим как раз ошибку выход за рамки массива, то есть тут функция умнее обычного [] там тоже должна быть ошибка ренжа
Но это прям совсем на пальцах не говоря о тебе памяти и все из этого вытекающего
Опять столкнулся с этой проблемой. В чем ее причина, я так и не могу понять. Есть какие-то соображения?)

Добавлено через 8 минут
Цитата Сообщение от MikaSan Посмотреть сообщение
Опять столкнулся с этой проблемой. В чем ее причина, я так и не могу понять. Есть какие-то соображения?)
Попытался через буффер сделать. Чтобы функция с итерацией дела не имела. Но результат тот-же.

C++
1
2
3
string buff;
buff = mas_str[i];
result_numb = buff.compare(3, length_of_search, search);
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.05.2019, 13:42
MikaSan,
Цитата Сообщение от MikaSan Посмотреть сообщение
buff.compare(3, length_of_search, search);
данная перегрузка этой функции бросает исключение, если buff.size() < 3. А у вас в конце вектора строки такие есть, т.к. вы криво читаете файл.
1
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 14:04
MikaSan, весь код плиз и сам файл, или он тот же?
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:11  [ТС]
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, весь код плиз и сам файл, или он тот же?
Тот же
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 14:12
Цитата Сообщение от MikaSan Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
getline(cin, search);
* * length_of_search = search.size();
for (int i = 0; i < mas_str.size(); i ++)
* * * * {
* * * * * * result_numb = mas_str[i].compare(3, length_of_search, search); /* Т.к. поиск идет по фамилии, а она в строках стоит после 3х пробелов от начала строки, я написал такое условие. Делал через compare, а не через find, чтобы искал только по заданному диапазону. С 4-й позиции и до конца длины слова из поискового запроса. Чтобы дальше по строке он уше не проверял. Чтобы, если в другой графе ( не фамилия, а к примеру в адресе ) встретится слово из поискового запроса, то на печать бы вышли только варианты, где фамилия нашлась именно в графе фамилий. */
* * * * * * if ((result_numb == 0)&&(flag1 == 0)) {
* * * * * * * * cout << "Найдены совпадения" << endl << endl;
* * * * * * * * cout << mas_str[i] << endl;
* * * * * * * * flag1 = 1;
* * * * * * * * flag2 = 1;
* * * * * * } else
* * * * * * * * if ((result_numb == 0) && (flag1 == 1)) {
* * * * * * * * * * cout << mas_str[i] << endl;
* * * * * * * * * * flag2 = 1;
* * * * * * * * }
}
Блин проще с нуля переписать. Особенно напрегает gelline

Добавлено через 52 секунды
MikaSan, Запрос у\идет только по фамилии?
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:13  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
MikaSan,
данная перегрузка этой функции бросает исключение, если buff.size() < 3. А у вас в конце вектора строки такие есть, т.к. вы криво читаете файл.
То есть? Откуда у меня там строки такие?))
А как его читать иначе? Конечно я забыл закрыть файл после работы с ним, но разве это повлияет на результат в данном случае?
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 14:19
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:31  [ТС]
Цитата Сообщение от Mesteriis Посмотреть сообщение
Блин проще с нуля переписать. Особенно напрегает gelline

Добавлено через 52 секунды
MikaSan, Запрос у\идет только по фамилии?
Да. Поиск идет только по фамилии. Но это легко меняется диапазоном сравнения символов в строках
Прошу прощения за дезу. Я дописал еще чисто визуальную составляющую. Она при вывод найденных строк, те что длинее 95 символов визуально обрезает ( только на печать ), чтобы на новую строку не перескакивали ( размеры окна консоли стоят 100 на 30 )
Вот дописанный цикл.
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
for (int i = 0; i < mas_str.size(); i++)
    {
        buff = mas_str[i];
        result_numb = buff.compare(3, length_of_search, search);
        if ((result_numb == 0) && (flag == 0)) {
            cout << "Найдены совпадения" << endl << endl;
            flag = 1;
            flag1 = 1;
        }
        if ((result_numb == 0) && (flag == 1)) {
            counter1++;
            if (mas_str[i].size() > 95) {
                 str_buff = mas_str[i].substr(0, 95);
                 cout << i << str_buff << "..." << endl;
            }
            else {
            cout << i << mas_str[i] << endl;
 
            }
        }
    }
    cout << endl;
    if (flag1 != 1) {
        cout << endl;
        cout << "Совпадений нет" << endl;
        cout << endl;
    }
Добавлено через 4 минуты
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
Я в будущем и хочу обращаться только к 1 элементу. Но со структурами у меня беда. Дико туплю с указателями.
Как контролировать ее до загрузки в вектор? Векторы я только недавно открыл для себя. И в коде вроде бы просто считываю все из файла в вектор. Хотя я кажется подозреваю в чем дело... В цикле считывания строка эта последняя появляется?

Добавлено через 2 минуты
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
Черт, действительно создается пустая строка. Но как ее убрать безболезненно?
К слову, прав ли я в том, что из-за этой последней, пустой строки, когда функция начинает свою работу по сравниванию строк, то не может найти там нужной длины и выдает ошибку?

Добавлено через 3 минуты
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
Может сделать два вектора? В один будет идти считывание из файла. А второй будет забирать строки из первого, кроме последнего, ориентируясь на счетчик counter? Но это как-то громоздко. Может как-то полегче можно от пустой последней строки избавиться?
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.05.2019, 14:41
Цитата Сообщение от MikaSan Посмотреть сообщение
while (!tests.eof());
так делать не надо, это ошибка.
Во вторых просто добавь в цикле поиска проверку на размер строки
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:51  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
так делать не надо, это ошибка.
Во вторых просто добавь в цикле поиска проверку на размер строки
а как тогда мне написать проверку на вывод всего файла?
С проверкой размера строки все увенчалось успехом!))))) Спасибо огромное!))

Добавлено через 8 секунд
Спасибо всем!
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.05.2019, 14:54
MikaSan,
C++
1
2
3
4
//построчное чтение файла в вектор
std::ifstream ifs{ "file.txt" };
std::vector<std::string> lines;
for (std::string line; std::getline(ifs, line); lines.push_back(line));
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 20:03  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
MikaSan,
C++
1
2
3
4
//построчное чтение файла в вектор
std::ifstream ifs{ "file.txt" };
std::vector<std::string> lines;
for (std::string line; std::getline(ifs, line); lines.push_back(line));
О, красиво. попробую заменить. Правда для меня это совсем не очевидный способ вывести все строки из файла)). ТО есть алгоритм работает, пока не достигнет конца файла? Вернее, пока может считывать строки? Если я ошибаюсь, то растолкуйте пожалуйста))) А то так и не пойму))
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.05.2019, 20:07
MikaSan,
C++
1
2
3
4
5
for (
    std::string line;           // локальная строковая переменная, инициализируется при первом вхождении в цикл
    std::getline(ifs, line);    // считывает строку, возвращает ссылку на поток, если поток не ОК, цикл завершается
    lines.push_back(line)       // в конце итерации пушим строку в вектор
    );
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 20:17  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
MikaSan,
C++
1
2
3
4
5
for (
    std::string line;           // локальная строковая переменная, инициализируется при первом вхождении в цикл
    std::getline(ifs, line);    // считывает строку, возвращает ссылку на поток, если поток не ОК, цикл завершается
    lines.push_back(line)       // в конце итерации пушим строку в вектор
    );
Черт, это прекрасно. Если бы видели, насколько сейчас не оптимизирована моя курсовая, то наверное потрепали бы меня по плечу и молча ушли бы в закат))))) Спасибо огромное за объяснения!)))
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
13.05.2019, 23:01
MikaSan, Это сейчас такиие курсачи))))) Я помню писал GUI с шифрованием текста в картинку)
0
 Аватар для MikaSan
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
14.05.2019, 14:19  [ТС]
Если кого заинтересует тема и будет желание объяснить классы и разбитие программы на файлы Классы в С++. Разделение программы на файлы. Объясните пожалуйста на пальцах
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.05.2019, 14:19

Надо найти ошибку
Отдельные буквы русского алфавита, слова, фразы. Свойства: шрифт, размер, стиль (полужирный, курсив, подчеркнутый). Программа демонстрирует...

Надо найти ошибку
Задача: дан массив, требуется найти два равных в нем элемента и вывести их индексы. Есть логически верный код, но он не работает: #include...

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

Надо найти ошибку ,пожалуйста,
должна посчитать два интеграла, но считает их почему то неверно( метод парабол) помогите найти ошибку integrate1 x=from -1 to 4 ,...

Массивы.Надо найти ошибку
program lab7; uses crt; var a:array of integer;i,j:integer;s:real; begin clrscr;randomize; s:=0; writeln('Matrix A'); for...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru