Почему в c в консоли выводится абракадабра
Перейти к содержимому

Почему в c в консоли выводится абракадабра

  • автор:

Вводе в консоль «бьются» данные строк и выводится абракадабра вместо заданных слов

Код усложнён потому что пытался повторить ошибку более сложного проекта (получилось), чтобы было прощё её решить.

#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, &amp;quot;RU&amp;quot;) прописан?

64a41da8d5479157772559.png

Ввожу русские слово, а на выводе получаю слово на эльфийском
Например:

Почему так?

  • Вопрос задан 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 июл.

Комментировать

Нравится Комментировать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *