На этом уроке мы рассмотрим наиболее частые проблемы, с которыми сталкиваются новички при написании программ на языке C++.
Проблема №1
Как использовать кириллицу в программах C++?
Ответ №1
Чтобы выводить кириллицу в языке C++ нужно подключить заголовочный файл <Windows.h>:
1 |
#include <Windows.h> |
И прописать следующие две строки в функции main():
1 2 |
SetConsoleCP(1251); SetConsoleOutputCP(1251); |
В качестве альтернативного варианта можно использовать следующую строку в функции main():
1 |
setlocale(LC_ALL, "Russian"); |
Проблема №2
При выполнении программы появляется черное консольное окно, а затем сразу пропадает.
Ответ №2
Некоторые компиляторы (например, Bloodshed’s Dev C++) автоматически не задерживают консольное окно после того, как программа завершила свое выполнение. Если проблема в компиляторе, то следующие два шага решат эту проблему:
Шаг №1: Добавьте следующую строку кода в верхнюю часть вашей программы:
1 |
#include <iostream> |
Шаг №2: Добавьте следующий код в конец функции main() (прямо перед оператором return):
1 2 3 |
std::cin.clear(); std::cin.ignore(32767, '\n'); std::cin.get(); |
Таким образом, программа будет ожидать нажатия клавиши, чтобы закрыть консольное окно. Вы получите дополнительное время, чтобы хорошенько всё рассмотреть/изучить. После нажатия любой клавиши, консольное окно закроется.
Другие решения, такие как system("pause");
, могут работать только на определенных операционных системах, поэтому вариант, приведенный выше, предпочтительнее.
Примечание: Visual Studio не задерживает консольное окно, если выполнение запущено с отладкой ("Отладка" > "Начать отладку"
или F5
). Если вы хотите, чтобы была пауза — воспользуйтесь решением выше или запустите программу без отладки ("Отладка" > "Запуск без отладки"
или Ctrl+F5
).
Проблема №3
При использовании cin, cout или endl компилятор говорит, что cin, cout или endl являются «undeclared identifier» (необъявленными идентификаторами).
Ответ №3
Во-первых, убедитесь, что у вас присутствует следующая строка кода в верхней части вашей программы:
1 |
#include <iostream> |
Во-вторых, убедитесь, что cin
, cout
или endl
имеют префикс std::
, например:
1 |
std::cout << "Hello world!" << std::endl; |
Проблема №4
При использовании endl для перехода на новую строку, появляется ошибка, что end1 является «undeclared identifier».
Ответ №4
Убедитесь, что вы не перепутали букву l
(нижний регистр L
) в endl
с цифрой 1
. В endl
все символы являются буквами. Также легко можно перепутать заглавную букву О
с цифрой 0
(ноль).
Проблема №5
Моя программа компилируется, но работает не так, как нужно. Что мне делать?
Ответ №5
Выполните отладку программы. Детально об этом читайте на уроке №26 и на уроке №27.
Проблема №6
Как включить нумерацию строк в Visual Studio?
Ответ №6
Перейдите в меню "Средства" > "Параметры"
:
Затем откройте вкладку "Текстовый редактор" > "Все языки" > "Общие"
и поставьте галочку возле "Номера строк"
, затем нажмите "ОК"
:
Проблема №7
При компиляции программы я получаю следующую ошибку: «unresolved external symbol _main or _WinMain@16».
Ответ №7
Это означает, что ваш компилятор не может найти главную функцию main()
. Все программы должны содержать эту функцию.
Здесь есть несколько пунктов, которые нужно проверить:
Есть ли в вашей программе функция main()
?
Слово main
написано правильно?
Подключен ли файл, который содержит функцию main()
, к вашему проекту? (если нет, то переместите функцию main()
в файл, который является частью вашего проекта, либо добавьте этот файл в ваш проект)
Подключен ли файл, содержащий функцию main()
, к компиляции?
Проблема №8
При компиляции программы я получаю следующее предупреждение: «Cannot find or open the PDB file».
Ответ №8
Это не ошибка, а предупреждение. На работоспособность вашей программы оно не повлияет. Тем не менее, в Visual Studio вы можете решить всё следующим образом: перейдите в меню "Отладка" > "Параметры" > "Отладка" > "Символы"
и поставьте галочку возле "Серверы символов (Майкрософт)"
, затем нажмите "ОК"
.
Проблема №9
Я использую Code::Blocks или G++, но функционал C++11/C++14 не работает.
Ответ №9
В Code::Blocks перейдите в "Project" > "Build options" > "Compiler settings" > "Compiler flags"
и поставьте галочку возле пункта "Have g++ follow C++14 ISO C++ language standard"
. Смотрите урок №4 — там есть скриншоты, как это сделать.
При компиляции в g++, добавьте следующий код в командную строку:
Проблема №10
Я запустил программу, появилось консольное окно, но ничего не выводится.
Ответ №10
Ваш антивирус может блокировать выполнение вашей программы. Попробуйте отключить его на время и запустите программу еще раз.
У меня есть другая проблема, с которой я не могу разобраться. Как и где я могу получить ответ?
По мере прохождения данных уроков, у вас, несомненно, появятся вопросы или вы столкнетесь с проблемами. Что делать?
Во-первых, спросите у Google. Четко сформулируйте вашу проблему и просто «погуглите». Если у вас есть сообщение об ошибке — скопируйте его и вставьте в поиск Google, используя кавычки. Скорее всего, кто-то уже задавал такой же вопрос, как у вас, и получил на него ответ.
Если Google не помог, то спросите на специализированных сервисах вопросов/ответов, либо на форумах, посвященным тематике программирования/IT. Вот самые популярные из них:
Но будьте внимательны и старайтесь максимально конкретизировать свою проблему, укажите, какую операционную систему и IDE вы используете, а также то, что вы пробовали сделать самостоятельно для решения своей проблемы.
Очень качественно (все отправные точки). Второй заход, подзабыл. 3 года спустя, снова, спасибо!
Добавлю для тех кто на линуксе.
Путь проекта должен быть полностью на английском, а то будет выдавать блок будет ошибку выдавать при компиляции и дебаге: no input file.
Не знаю описана ли эта особенность выше, однако она может добавить много геморроя от поиска решения проблемы.
Если у вас при компиляции программы выскакивает на экране предупреждение по типу:
Название проекта.сpp
(Я приучиваюсь к английскому интерфейсу, поэтому, собственно, пример сообщения тоже приведу на нём:)
Some Unicode characters in this file could not be saved int the current codepage. Do you want to resave this file as Unicose in order to maintain your data?
И варианты ответа:
Да(В первый раз я бездумно клацнул эту кнопку. Оказалось зря — посыпались ошибки);
Нет;
Сохранить с другой кодировкой;
Отмена.
Итак, что нужно делать:
Нажимаем на 'Сохранить с другой кодировкой / Save with another encoding';
Под словом, соответственно, 'Кодировка: / Encoding: ' кликаем на скролл бар, и нам открывается обширный набор кодировок;
Совсем чуть-чуть промотав, находим Cyrillic (Windows) -Codepage 1251 и выбираем его.
Кликаем ОК, и, затаив дыхание, следим за окошком вывода;)
Присоединяюсь к вопросу о возможности ввода-вывода китайских иероглифов с использованием ввода стандартного языка в пакете Windows. Все, что лежит на поверхности на форумах (типа setlocale(chinese_simplified) с различными аббревиатурами аргумента и предлагаемыми инклудами уже испробовано. IDE Dev++. Не писать же их через кодировку в unicode
к первому вопросу.
нужно что б юникод редактора совпадал с юникодом винды.
по стандарту он UTF-8 должен быть. его нужно поменять в проге в какой вы пишите код и затем в винде.
1.Нажмите Пуск, затем Панель управления
2.Нажмите Часы, язык и регион
3.В Windows 10, Windows 8: нажмите Регион
В Windows 7: нажмите Язык и региональные стандарты
В Windows XP: нажмите Язык и региональные стандарты
4.Открывается диалоговое окно "Язык и региональные стандарты".
5.Нажмите на вкладку Администрирование
В Windows XP нажмите на вкладку Дополнительно
Если такой вкладки нет, то вход выполнен не с полномочиями
администратора.
6.Под строкой "Язык программ, не поддерживающих Юникод" нажмите Изменить язык системы и выберите нужный язык.
Нажмите ОК
Перезапустите компьютер, чтобы изменения вступили в силу
у меня сработало.
И у меня сработало! Благодарю! С Новым Годом и Рождеством!
Добрый день, Разбирался с проблемой №1, если в параметре "Отключить расширения языка" стоит "Нет", то всё работает, если в вышеуказанном параметре стоит "Да", то выводит такую ошибку:
"1>—— Сборка начата: проект: test, Конфигурация: Debug Win32 ——
1>test.cpp
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winnt.h(12723,10): error C2467: недопустимое объявление анонимного "struct"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winnt.h(20801,34): error C2133: _IMAGE_POLICY_METADATA::Policies: неизвестный размер
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winioctl.h(4327,10): error C2467: недопустимое объявление анонимного "struct"
1>Сборка проекта "test.vcxproj" завершена с ошибкой.
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 =========="
Добрый день!
Такой код программы.
Ругается на подключаемый модуль
1>—— Сборка начата: проект: Lesson, Конфигурация: Debug x64 ——
1>Lesson.cpp
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winnt.h(12723,10): error C2467: недопустимое объявление анонимного "struct"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winnt.h(20801,34): error C2133: _IMAGE_POLICY_METADATA::Policies: неизвестный размер
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winioctl.h(4327,10): error C2467: недопустимое объявление анонимного "struct"
1>Сборка проекта "Lesson.vcxproj" завершена с ошибкой.
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Понятно, что проблема в коде подключаемого модуля, но разве так может быть?
У меня была похожая проблема, попробуй поставить значение в параметре "Отключить расширения языка" на "Нет"
Не подскажите, что нужно подключить, чтобы выводить китайские иероглифы и японское письмо в C++? Или ссылочку какую — нибудь об этом. Заранее благодарю. С уважением, Илья.
Еще один вариант для решения проблемы №1 это работать с utf8 bom.
Здравствуйте!
В первой проблеме никак не получается вывести кириллицу: пишу #include <Windows.h>
Выдает ошибку сборки.
Используя такой вариант, все получается:
Изменила шрифт консоли, как указывалось в комментарии выше, проблема не решилась.
Подскажите пожалуйста, как быть, очень хочется разобраться, а не получается.
Библиотека <iostream> отвечает за функции ввода-вывода, в первом случае она не подключена, а значит и "cout" сработать не сможет.
CP_UTF8 вместо 1251
с десятой винды короче используется юникод
Пробовал с CP_UTF8 вылезло пустое окно, с 1251 все ок работает. 10 винда, версия VS 16.10
Здравствуйте, при запуске программы через консоль выдается расположение файла, что делать?
Проблема с #include "pch.h". Пишется что такой библиотеки нету. Ради этого даже переустановил win10. В чём проблема не понимаю. Пишет: Не удается открыть источник файла pch.h No such file or directory. Пишу первой стройкой как в уроке №5.
В MS Visual Studio 2019 подключение pch.h не требуется.
Спасибо большое за ваши уроки, всего доброго вам.
Спасибо Юрий! Мне пришло понимание что я делал не так. Вопрос сразу разрешился.
Здравствуйте! Юрий! В CodeBlock пытаюсь использовать кириллицу. По вашему совету зашёл в командную строку и в консоли "Свойства" в закладке "Шрифт" изменил шрифт на Lucida Console — за тем "OK".
Перезапустил ПК, проверил — шрифт поменялся. А код не изменился.
Буквы не соответствуют и получается аброкадабра. Попробовал заново написать код. Результат тот-же. Пожалуйста помогите разобраться с этим вопросом. Заранее благодарен Александр.
Здравствуйте, а как вы цитируете код в комментах?
Чтобы на черном фоне выводилось, к примеру
С помощью определённого плагина в админке.
Добрый день!
Подскажите, как быть. После CTRL+F9 проекта HelloWorld в Code::Blocks выдает сообщение:
"Tried to run compiler executable 'C:\MinGW/bin/mingw32-gcc.exe', but failed!"
Отвечу сам себе. Решил вопрос путём переустановки Windows с последующей установкой Visual Studio.
Возможно ли сделать так, чтобы проблема 2 решалась, так чтобы после ввода любой клавиши для закрытия окна консоли не нужно было нажимать enter?
Вечер добрый, очень доступно все написано.
По поводу — убедитесь, что cin, cout или endl имеют префикс “std::”.
Не проще прописать перед main единожды строчку кода — using namespace std; или есть нюансы?
Привет. Можно прописать и using, но есть нюансы. Какие? Читайте урок №54.
Спасибо за уроки, пока все получается и ошибок нет.
как сделать так чтобы консоль не закрывалась любой клавишей а только крестиком?
Я вот лично решил с юного возраста начать этим заниматься, и пока что не очень получается:)
У меня выдается 458 ошибок при компиляции…Это нормально?…
Или я не туда смотрю?…
да норм, если ты печатаешь большой код, это уже прогресс, я за 3тий день только hello world научился делать. Просто не здавайся и все получится)
Юрий что делать,пишу на русском в командной строке все буквы правильные,запускаю проект-там буквы русские, но другие совсем.
Про end1 и endl. У меня целая история, 2 дня я сидел и пересматривал код. А вообще спасибо за статьи!
Эт да, кажется такие мелочи, а столько времени убивают.
На другом ресурсе для кириллицы предлагают использовать setlocale(LC_ALL, "rus");,
тут SetConsoleCP(1251); и SetConsoleOutputCP(1251);, в чем разница?
В
вы устанавливаете использование локальных параметров (в этом случае, русских). В
вы меняете кодировку вашего проекта. В этом и отличие, несколько разные подходы для выполнения одного действия. В статье указан второй способ, так как он более эффективен.
В CodeBlocks при указании
и прописывании в main()
все равно пишет кракозябры вместо русских слов.
Хотя при добавлении строчки
русский определяется.
Что делаю не так?
Попробуйте изменить шрифт в консоли. По умолчанию в консоли стоит шрифт Consolas (у вас может быть другой) — он и может препятствовать корректному выводу/вводу кириллицы через SetConsole. Зайдите в консоль через cmd — ПКМ по верхней панели консоли — выберите «Свойства» — закладка «Шрифт» — установите в качестве шрифта Lucida Console — затем «ОК».
Работает.
Спасибо!
Пожалуйста 🙂
А как добавить казахский язык?
Вы пишите в коде std :: cout<<, std :: cin >>.
А можно написать using namespace std; и не писать по всему коду std ::
Это зависит от привычки (инд. почерка) или есть какой то секрет ?
Спасибо.
P.S. Пришел к Вам с другого сайта, у Вас более доходчиво.
Можно, но есть нюансы. Об этом подробно в 54 уроке.