@Kiamran03

Как решить проблему с исключением в моем коде?

Мне дали задание написать программу, которая берёт текст из txt-файла и переводит его на язык азбуки Морзе. Программу я написал, но после компиляции выходит неизвестная мне ошибка.

Объясните мне пожалуйста, что это за ошибка и как её решить?

Исходный код программы
#include <iostream>
#include <string>
#include <map>
#include <cctype>
#include <Windows.h>
#include <fstream>

using namespace std;
 
map <char, string> morze = {
    	{ 'а', ".-"},
    	{ 'б', "-..."},
    	{ 'в', ".--"},
    	{ 'г', "--."},
    	{ 'д', "-.."},
    	{ 'е', "."},
    	{ 'ж', "...-"},
    	{ 'з', "--.."},
    	{ 'и', ".."},
    	{ 'й', ".---"},
    	{ 'к', "-.-"},
    	{ 'л', ".-.."},
    	{ 'м', "--"},
    	{ 'н', "-."},
    	{ 'о', "---"},
    	{ 'п', ".--."},
    	{ 'р', ".-."},
    	{ 'с', "..."},
    	{ 'т', "-"},
    	{ 'у', "..-"},
    	{ 'ф', "..-."},
    	{ 'х', "...."},
    	{ 'ц', "-.-."},
    	{ 'щ', "--.-"},
    	{ 'ъ', ".--.-."},
    	{ 'ы', "-.--"},
    	{ 'ь', "-..-"},
    	{ 'э', "..-.."},
    	{ 'ю', "..--"},
        { 'я', ".-.-"},
    	{ '1', ".----"},
    	{ '2', "..---"},
    	{ '3', "...--"},
    	{ '4', "....-"},
    	{ '5', "....."},
    	{ '6', "-...."},
    	{ '7', "--..."},
    	{ '8', "---.."},
    	{ '9', "----."},
    	{ '0', "-----"},
    	{ '.', "......"},
    	{ ',', ".-.-.-"},
    	{ '!', "--..--"},
};
 
int main() {
    setlocale(LC_ALL, "ru");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
	string text;

    string line;

    std::ifstream in("C:\\Users\\user\\Desktop\\azbukamorze\\in.txt"); // окрываем файл для чтения
    if (in.is_open())
    {
        while (getline(in, line))
        {
            line = text;
        }
    }

    for (int i = 0; i < text.length(); i++) {
            	text[i] = tolower(text[i]);
            	cout << morze.find( text[i] )->second <<"  ";
            }
    in.close();     // закрываем файл

    ofstream out;          // поток для записи
    out.open("C:\\Users\\user\\Desktop\\azbukamorze\\out.txt"); // окрываем файл для записи
    if (out.is_open())
    {
        out << morze.find(' ')->second << "  ";
    }
    cout << morze.find(' ')->second << "  ";
    out.close();
 
	return 0;
}

628f358a9cd15656216801.png
Скриншот с местом остановки отладчика
628f35a660452100908402.png
  • Вопрос задан
  • 490 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Ошибка в недрах стандартной библиотеки. Вы в вашей программе что-то не так делаете и она падает. Это частая проблема в C/C++, можно допустить такие ошибки, что программа упадет.

Вы уже открыли вашу программу в дебаггере. В правом нижнем углу вы видите стек. Первые 3 функции - это в недрах библиотеки. Вам тут ничего не понятно, поднимайтесь вверх. Ткните в четвертую строчку - там где Main().

Увидите, что ошибка происходит на строчке:
cout << morze.find( text[i] )->second <<" ";

Проблема возникает при попытке обратиться к second у возвращенного значения. Но почему? Читайте ошибку: "cannot dereference end map/set iterator".

Т.е. find возвращает end() итератор. Действительно, посмотрите в документацию - map вернет end() если искомого ключа в нем нет.

Иправить ошибку просто - исправьте ваш код. Сначала присвойте переменной возвращенный из find итератор, и потом проверяйте, а не end() ли он. И только в противном случае выводите.

Я подозреваю, что символом оказался пробел. Пробела в вашем мапе morze нет, вот все и падает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Читаем документацию: что возвращает std::map.find(). И что - может вернуть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы