Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 28.06.2023
Сообщений: 18

Ввод русского текста в консоли

21.12.2023, 13:34. Показов 2001. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, у меня возникла такая ситуация.
Прописал в коде setlocale(LC_ALL, "RU"). Текст написанный в коде на русском отображается как надо, но когда я ввожу в переменную типа string в консоле, то отображаются не понятные символы.
Скриншот предоставлен
Миниатюры
Ввод русского текста в консоли  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2023, 13:34
Ответы с готовыми решениями:

Ввод в файл с консоли русского текста
Есть ф-ия, для добавления студентиов в базу. На английском вводит номрально, а на русском к сожалению нет. Локаль в мейне подключена....

Вывод русского текста в консоли
Ребят для курсового проекта требуется реализовать ввод русских букв, сколько уже не мучался с этим итог нулевой. Пробовал ...

Вывод русского текста в консоли
Доброго времени суток.Помогите пожалуйста в таком вопросе.Вот простенькая программа,которой нужно ввести имя,а она выведет Привет,введеное...

13
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
21.12.2023, 13:46
Покаж кот.
0
0 / 0 / 0
Регистрация: 28.06.2023
Сообщений: 18
21.12.2023, 13:48  [ТС]
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
#include "pch.h"
 
#include <algorithm>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <string>
#include <vector>
 
using namespace System;
 
int main(array<System::String ^> ^args)
{
    setlocale(LC_ALL, "ru-RU");
 
    std::vector<std::string> names;
    std::vector<int> reserve_table;
 
    size_t max_lenght{}; // Longest name lenght
    
    while (true) {
        std::cout << " Укажите имя Бронировавшего столик: ";
        std::string name; // считываем имя человека, который бронирует столик
        std::getline(std::cin, name);
 
        names.push_back(name); // сохраняем в массив имя
        
        if (max_lenght < name.length()) max_lenght = name.length();
        while (true) {
            std::cout << " Введите номер забронированного столика: ";
            int table;
            std::cin >> table;
            if (reserve_table.size() > 0) {
                bool exists = std::find(reserve_table.begin(), reserve_table.end(), table) != reserve_table.end();
                if (exists == false) {
                    reserve_table.push_back(table);
                    break;
                }
                else std::cout << " Данный столик забронирован " << std::endl;
            }
            else { reserve_table.push_back(table); break; }
        }
 
        std::cout << "Закончить? (y/n): ";          // спрашиваем, закончить ли ввод
        char answer{};
        std::cin >> answer;
 
        // Игнорируем введенный перевод строки после символов y/n
       // чтобы при следующем вызове std::getline() не считывалась пустая строка
        std::cin.ignore();
        // если введено Y/y, завершаем ввод и выходим из цикла
        if (answer == 'Y' || answer == 'y') break;
    }
 
    std::cout << " Имя\tЗабронированный столик" << std::endl;
    for (size_t i{}; i < names.size(); ++i) {
        std::cout << names[i] << "\t" << reserve_table[i] << std::endl;
    }
    return 0;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
21.12.2023, 13:52
Цитата Сообщение от 72vladdayz Посмотреть сообщение
Прописал в коде setlocale(LC_ALL, "RU").
C++
1
setlocale(LC_ALL, "Russian_Russia.866");
И файл исходника тоже конверировать в 866.

72vladdayz, Не выводятся wchar_t символы
Это, если интересны подробности.
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
21.12.2023, 14:00
72vladdayz, у меня нет компилятора microsoft. Однако, в любом случае, советую отказаться от 8-битной кодировки символов. Юникод давно везде, со времён WinXP (а то и Win2k).



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
// пример работы с юникодом в консоли.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
 
// разворот unicode-строки
wchar_t* task3(wchar_t* src)
{
  for (wchar_t *i = src, *j = src + wcslen(src) - 1; i < j; ++i, j--) 
    *i ^= *j, *j ^= *i, *i ^= *j;
  return src;
}
 
#define BUFSIZE 256
 
int main()
{
  _setmode(_fileno(stdout), _O_U16TEXT);
  _setmode(_fileno(stdin),  _O_U16TEXT);
  
  wchar_t A[BUFSIZE];
  wprintf(L"? Пожалуйста, введите строку: "); 
  fgetws(A, BUFSIZE, stdin);
  A[wcslen(A) - 1] = 0; // гашение конечного \n
  wprintf(L"Вы ввели строку \x22%S\x22\n", A);
  wprintf(L"# В обратном порядке: \x22%S\x22\n", task3(A));
  
  //system("pause");
  return 0;
}
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
21.12.2023, 14:00
Цитата Сообщение от 72vladdayz Посмотреть сообщение
array<System::String ^> ^args
Что это за чудо?
Цитата Сообщение от 72vladdayz Посмотреть сообщение
setlocale(LC_ALL, "ru-RU");
setlocale оставляет 866 кодовую таблицу при вводе с клавиатуры.
Я предпочитаю
C++
1
system("chcp 1251 > NUL");
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
21.12.2023, 14:08
Цитата Сообщение от zss Посмотреть сообщение
setlocale оставляет 866 кодовую таблицу при вводе с клавиатуры.
Оно и при выводе ее оставляет. Это две разные кодировки: кодировка локали и кодировка консоли.
А вот chcp 1251 или SetConsoleCP\SetConsoleOutputCP, что одно и то же, меняют 866 кодировку консоли на указанную.
Настройки локали, которые ставятся через setlocale, отрабатывают позже и работают с заданной кодировкой консоли.
См. мою ссылку выше с примерам и разъяснениями.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.12.2023, 16:18
72vladdayz, зачем было создавать проект CLI, если ты пишешь на C++?
0
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
21.12.2023, 17:37
Цитата Сообщение от zss Посмотреть сообщение
array<System::String ^> ^args
Что это за чудо?
Это майкрасофтский "диалект" C++ - C++/CLI. Используется в основном для оберток нативных ("unmanaged" в их терминологии) библиотек для .NET. Зачем вопрос по нему в этом разделе - непонятно.
Может из-за невнимательности: VS на каждом шагу предлагает включить поддержку CLI.

Добавлено через 10 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
setlocale(LC_ALL, "Russian_Russia.866");
Согласен с Verevkin, этот способ не работает уже у меня.
Компилятор clang++ 17.0.2, с target-ом x86_64-w64-windows-gnu, т.е. MinGW64.
Для простых консольных программ просто линкую
Код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
 
#include <fcntl.h>
#include <io.h>
 
namespace {
    class RuLangHelper {
    public:
        RuLangHelper() : oldStdoutMode_ { _setmode(_fileno(stdout), _O_U16TEXT) }, oldStdinMode_ { _setmode(_fileno(stdin), _O_U16TEXT) }, oldStderrMode_ { _setmode(_fileno(stderr), _O_U16TEXT) } { }
 
        ~RuLangHelper() { _setmode(_fileno(stdout), oldStdoutMode_); _setmode(_fileno(stdin), oldStdinMode_); _setmode(_fileno(stderr), oldStderrMode_); }
 
    private:
        const int oldStdoutMode_;
        const int oldStdinMode_;
        const int oldStderrMode_;
    } inst__;
}


И использую std::wcout и std::wcin.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
21.12.2023, 18:03
pechka_ne_sed, выше все написано по ссылке, читайте там. Этот способ, точнее название локали, из компилятора Microsoft, поэтому у вас и не работает.
1
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
22.12.2023, 05:16
DrOffset, почему же он так распространен? Ведь он зависит от компилятора (пускай и самого популярного), и новички при переходе на другие платформы могут очень сильно запутаться .
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
22.12.2023, 09:04
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
почему же он так распространен?
Вы сами и ответили на вопрос:
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
компилятора (пускай и самого популярного)
А вообще тут новичок в любом случае пострадает.
Например способ, который я описывал (и который вы показали в своем коде) по ссылке как правильный с точки зрения создания интернационального приложения, не будет работать в MinGW на Windows 7 и ниже, только в VC++. И не будет работать даже в VC++ на WinXP и ниже. Не говоря уже про всякие Борланды. Переносимости нормальной тут нет в принципе.
И на современных системах новичок при попытках организовать переносимый код в первую очередь столкнется с тем, что в *nix принята основной кодировкой UTF-8, а в Windows - UTF-16, что тоже повлечет трудности при написании кода.
Радует только одно: писать консольные приложения в Windows с поддержкой русского языка в основном только новичкам и приходится, поэтому они вполне могут обойтись самым примитивным костылем (особенно если им только лабу сдать). Из кучи подобных тем только малая часть людей хотела действительно разобраться как это работает, остальным нужен был просто готовый код и все.
2
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
22.12.2023, 11:35
Судя по тому что тема в разделе NET, то в NET весь консольный ввод/вывод происходит в Unicode. И для вывода в консоль используется Console.WriteLine() и т.д., для чтения Console.ReadLine() и т.д.
1
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
22.12.2023, 17:43
Andrey-MSK, да, там даже char 2 байта весит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2023, 17:43
Помогаю со студенческими работами здесь

Вывод русского текста на экран в консоли
Столкнулся с такой проблемой. На экран консоли выводит краказябры. Что делать??? Вот код программы: #include &quot;pch.h&quot; ...

Вместо русского текста в коде иероглифы (не в консоли)
Почему-то русский текст пропал, сначала все было на русском и комментарии и остальное, потом стало так.. в консоли все нормально... сейчас...

Ввод русского текста
при вводе русского вопроса &quot;кто ты?&quot; программа не воспринимает его. и выводит &quot;I can't answer for this question. What is the...

Некорректный ввод русского текста
Всем привет..столкнулся с такой проблемой. Есть программа которая считывает с файла текст на русском языке. Я его спокойно могу...

Ввод с клавиатуры русского текста
Привет форум. Сел писать програмку на С++ и встретился с проблемой. Вот собственно задание &quot;C клавиатуры посимвольно вводится...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru