Вводе в консоль «бьются» данные строк и выводится абракадабра вместо заданных слов
Код усложнён потому что пытался повторить ошибку более сложного проекта (получилось), чтобы было прощё её решить.
#include #include using namespace std; const int a = 50; class chars < char s[a], h[a], * j = 0, *f = 0; public: void set_s(char* b) < j = s; j = b; >void set_h(char* n) < f = h; f = n; >char *get_s() < return j; >char* get_h() < return f; >>; chars h[2]; void chars_1(); void out(); int main() < int d = 5; chars_1(); cin >> d; out(); > void chars_1() < char c[a], d[a], * v = 0, *b = 0; v = c; b = d; cin >> v; cin >> b; h[1].set_s(v); h[1].set_h(b); > void out()
В сегменте
int main() < int d = 5; chars_1(); cin >> d; out(); >
Если задействовано cin >> d;, то вывод ломается и выводит вообще не то, что нужно, но если это строку закоментировать, то всё работает, как должно.
До добавления второго массива символов в класс всё работало, как должно вне зависимости от ввода. Мне кажется, что ошибка связана с выделением памяти для консоли, но не знаю, как это исправить и насколько вообще верно это предположение.
Кириллица в консоли
Самый лучший способ изучения языка программирования С++ — это составление консольных программ. Структура консольного проекта максимально упрощена, так как нет графического режима, для которого необходимо подключение файлов ресурсов, классов и прочего, прочего. При составлении программы может понадобиться вывести некоторое текстовое сообщение в консоль. И если это сообщение написано на латинице, то в командной строке Windows оно будет отображаться корректно. А если текстовое сообщение написано на кириллице, то вместо передаваемого сообщения, будет отображаться непонятная последовательность букв и символов (см. Рисунок 1). Реализуем программно то, что мы хотим сделать.
// rus_text.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < cout
// rus_text.cpp: определяет точку входа для консольного приложения. #include using namespace std; int main(int argc, char* argv[]) < cout
Программа передаёт сообщение Кириллица в консоли в командную строку Windows, и на этом завершает свою работу (см. Рисунок 1).
CppStudio.com
╩шЁшыышЎр т ъюэёюыш Для продолжения нажмите любую клавишу . . .
Рисунок 1 — Кириллица в консоли
В результате, вместо передаваемого сообщения отображается непонятная последовательность символов, называемая — козяблики. Возникает вопрос: «Почему так происходит?». Чтобы понять природу происхождения так называемых козябликов, необходимо обратиться к теме — представление символов букв в компьютерах.
Природа вычислительных машин такова, что они могут работать только с числами. Поэтому, для представления букв или символов необходимо их закодировать, то есть каждой букве или символу присвоить определённое число, которое будет являться его кодом. Так образовались таблицы кодирования символов. В связи с тем, что в мире существует более 2,5 тысяч языков, то для каждого алфавита создавались свои таблицы кодирования символов, вот почему существует большое количество таблиц кодирования символов. Так как мы программируем под Windows, то нас будут интересовать такие кодировочные таблицы: cp866, cp1251 и utf-8(стандарт Unicode). Хотя уже давно разработан единый стандарт кодирования символов — Unicode, в Windows до сих пор используются несколько кодировочных таблиц, а именно — cp866, cp1251. Использование нескольких таблиц кодирования символов и является причиной появления козябликов, вместо сообщения Кириллица в консоли .
Unicode — единый стандарт кодирования символов, позволяющий представить знаки всех письменных языков.
Таким образом стандарт Unicode присваивает каждому символу уникальный код, независимо от языка. Сейчас Unicode считается лучшим стандартом кодирования символов. Вернёмся к нашей проблеме — вывод кириллицы в консоль.
Так уж повелось, в командной строке Windows кодировка символов соответствует стандарту cp866. То есть все символы в командной строке Windows закодированы по кодировочной таблице cp866. Причём поменять кодировку в командной строке Windows нельзя. Просмотреть стандарт кодирования символов в консоли можно, с помощью команды GRAFTABL (см. Рисунок 2).

Рисунок 2 — Кириллица в консоли
Во всех русскоязычных Windows кодировка cp1251 является стандартной 8 — битной кодировкой. И при создании проекта в MVS2010 этот стандарт кодирования символов наследуется проектом, то есть программой. Хотя кодировку для проекта в MVS2010 можно легко поменять, это не решает проблемы, так как консоль понимает только одну кодировку cp866, которой в MVS нет. В итоге, получается, что программа передаёт коды символов сообщения стандарта cp1251. Командная строка принимает эти коды и переводит их в символы, но уже по стандарту cp866, так как другого стандарта не знает. В итоге сообщение передано в консоль, но символы интерпретированы не правильно, вот так и появляются козяблики.
Решить данную проблему можно только одним способом — перед тем, как передать текст в консоль, необходимо его перекодировать в стандарт кодирования символов cp866. Существует несколько способов преобразования кодов знаков из одного стандарта в другой, мы воспользуемся самым простым — настройка локали.
Локаль — это набор параметров: набор символов, язык пользователя, страна, часовой пояс и др. Локаль необходима для быстрой настройки пользовательского интерфейса, в зависимости от географического положения. В С++ есть функция setlocale() , которая выполняет перекодировку символов в соответствии с требуемым языком. Эта функция определена в заголовочном файле . Переделаем программу, которая передает сообщение Кириллица в консоли в командную строку windows.
// rus_text.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv[]) < setlocale(LC_CTYPE, "rus"); // вызов функции настройки локали cout
Почему в c в консоли выводится абракадабра
whynesspower → Reverse check the questions: ChatGPT
![]()
-arma- → SQRT decomposition for beginners
_Firdavs_Aminov_ → Dark theme Codeforces
Imakf → Codeforces Round 906 Editorial
elshiko → Квалификационный раунд Yandex Cup 2023
whynesspower → [URGENT] Codeforces need anti-scrapping
atcoder_official → Panasonic Programming Contest 2023(AtCoder Beginner Contest 326) Announcement
MercilesslyMan → Vim for competitive programming
AquaMoon → Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) Editorial
74TrAkToR → Codeforces Round #904 (Div. 2) Editorial
Imakf → Codeforces Round 906 (Div. 1, Div. 2)
Sokol080808 → Codeforces Round #881 (Div. 3) Разбор
127.0.0.1 → Codeforces Round 907 (Div. 2)
arpit_aditya → Cherry Pickup Leetcode 741 - Why is this approach giving wrong Answer?
yrhiba → I think tomorrow is the day!
Loserinlife → Sum of kth smallest distances.
nor → [Feature Request/Informational Content] Consider adding the Boost C++ library on Codeforces
chenjb → Rescheduling of World Finals 22&23
SkippedSolution → DP bitmask or DNC ?
purp4ever → Teams Qualified for Africa and Arab Collegiate Programming Championship — ACPC 2023 (+teens)
![]()
awoo → Разбор Educational Codeforces Round 115
![]()
nagitaosu → Codeforces rating distribution
-kirito- → Invitation to TheForces #25 (5^2-Forces, TheForces-Rated, Prizes!)
Esomer → Math and informatics competition, with prizes!
74TrAkToR → Codeforces Round #905 (Div. 1, Div. 2, Div. 3) Editorial
Блог пользователя 0O0o000O0Oo0o0Oo
Автор 0O0o000O0Oo0o0Oo, 11 лет назад ,
У меня возникла такая проблема, может кто знает как решить? Нужно читать, обрабатывать и выводить (в консоль и в файл) текст, в котором содержатся специальные символы, которых нет в кодировке ANSI, но есть в Unicode (пример таких символов: ᴖ ᴗ). С русскими буквами проблем нет, все выводится как надо, а вот со специальными символами — проблема. Не выводятся ни в файл, ни в консоль. Может кто-то сталкивался с такой проблемой. Заранее спасибо!

кодировка, с++
Комментарии (5)
Показать архивные | Написать комментарий?
11 лет назад , # |
По умолчанию в консоли (в винде) и файлах используется какая-нибудь однобайтная кодировка. Например, cp1251. Она не содержит нужных вам символов, только русские. Посмотрите, в какой кодировке сохранён код программы (правильно понимаю, что в коде всё прекрасно видно?) и откройте файл с выводом в такой же. Как заставить виндовую консоль работать в юникоде, я не знаю, а линуксовая часто работает в нём по умолчанию.
11 лет назад , # |
Если речь о windows и visual c++ компиляторе, то можно глянуть на древнюю-древнюю статью и комментарии к ней. А вообще проблема слишком многогранна, нужно хотя бы знать откуда и в какой кодировке берется текст, а также операционные системы и компиляторы с которыми должно работать решение.
11 лет назад , # |
← Rev. 2 →
0 
Система — Windows. Компилятор — visual c++. Данные берутся из текстового файла (*.txt). Файл сохранен в кодировке Unicode.
11 лет назад , # ^ |
← Rev. 2 →
+10 
Я бы посоветовал немножко сначала разобраться в понятиях, чтобы не было терминологической путаницы в будущем. Unicode тоже, конечно, называют иногда кодировкой. Но Unicode — это по сути стандартизированное отображение логических символов на целые числа. То есть такая большая таблица, в которой каждому символу ставится в соответствие число. А есть еще конкретные реализации character encodings, которые кодируют эти числа из таблицы в битовое представление, фактически в другие числа. Цель этого кодирования обычно — уменьшить необходимый объем памяти при задании строк в среднем. Распространенные кодировки для Unicode — это UTF-8, UTF-16, etc Для работы с юникодом на уровне С++ есть wchar_t, в stl есть соответственно wstring, wcout, etc (это если не трогать пока С++11). На уровне visual studio и Microsoft-specific нужно разобраться с макросами UNICODE, _UNICODE, _T, TCHAR, LPCTSTR и прочими.
C++. Почему в консоли выводит непонятные символы, хотя setlocale(LC_ALL, &quot;RU&quot;) прописан?

Ввожу русские слово, а на выводе получаю слово на эльфийском
Например:
Почему так?
- Вопрос задан 04 июл.
- 120 просмотров
Комментировать
Решения вопроса 1
code_panik @code_panik
Если кратко, то у windows беда с многообразием представлений символов (кодировок) в терминале. Есть однобайтовые 866 (стандартная терминала), 1251 (ansi), есть многобайтовая 65001 (utf-8). Чтобы проверить кодировку, в терминале наберите chcp. Если нет особых требований к работе с кодировками, достаточно обычного подхода
#include #include using namespace std; int main() < string words; cin >> words; cout
Пример работает с 866 и 1251.
Если нужна кодировка 1251 (и она не выбрана для терминала по умолчанию при запуске), запускайте программу из подготовленного окна терминала. Для этого в терминале наберите сначала однажды chcp 1251. Кодировка может понадобиться, если в исходном коде программы в кодировке 1251 будут строки с кириллицей.
Ответ написан 04 июл.
Комментировать
Нравится Комментировать