Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 3

Неправильный вывод кириллицы в строках, заданных с консоли

07.01.2015, 06:18. Показов 4369. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Вот не как не могу доделать до конца программу, буду рад если поможете!
Вот код исходный, набираю код в VS 12 ultimate. в последнем блоке программы не так как хочется выводятся значения,
Суть- через цикл набираю массив(фамилии на русском языке 10 шт), делаю вывод массива набранного, выводит вместо русских букв разные символы.
Еще раз заострю на алгоритме внимание: Ввожу по строчно 10 фамилий, потом делаю одним списком вывод фамилий, но выводятся они уже не читабельно, суть проблемы понимаю но знаний своих не хватает чтоб решить до конца, Пожалуйста подскажите что делать. Блок кода проблемного в рамках этих границ "////////////////////////////".

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
61
62
63
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{    setlocale(0, "");
 
    string valid_pass = "qwerty123";
    string user_pass;
    cout << "Введите пароль: ";
    getline(cin, user_pass);
    
   if (user_pass != valid_pass)
        {
        cout << "Неверный пароль!\n" << endl;  
    return main();
         }
    else  
         {
        cout << "\nДоступ  к базе фамилий разрешен:\n" << endl; 
         }
    
    string students[10] = 
    {
        "Иванов", "Петров", "Сидоров",
        "Ахмедов", "Ерошкин", "Выхин",
        "Андеев", "Вин Дизель", "Картошкин", "Чубайс"
    };  
     for (int i = 0; i < 10; i++) 
    {
        cout << students[i] << endl;
    }
 
        cout << "\nДля создания нового списка фамилий введите их последовательно." << endl;
 
 
 
    ///////////////////////////////////////////////////////////////////////
        string newstud[10];
 
        // Заполняем массив с клавиатуры
        for (int w = 0; w < 10; w++) 
        {
            cout << "[" << w + 1 << "]" << ": ";
            cin >>newstud[w];
        }
 
 
        // И выводим заполненный массив.
        cout << "\nВаш новый снисок фамилий:\n";
 
        for (int w = 0; w < 10; ++w) 
        {
           cout << "[" << w + 1 << "]" << ": "<<newstud[w]<< "\n";
        }
 
        cout << endl;
//////////////////////////////////////
 
 
        return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2015, 06:18
Ответы с готовыми решениями:

Неправильный вывод кириллицы в консоль
Здравствуйте уважаемые форумчане. Нуждаюсь в Вашем совете. Моя программа(ка :-непонятные символы. При этом в файл все выводится как надо. ...

Неправильный вывод в консоли
установил студию, а у меня вывод такой, как будто бы сместились символы, подскажите пожалуйста что можно сделать

Неправильный вывод в консоли
Чому неправильно виводить на екран a.s a.bals каждый раз в другом месте #include &lt;iostream&gt; #include &lt;string.h&gt; #include...

16
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
07.01.2015, 06:24
Обычно подключают #include <clocale> и пишут, в начале main, setlocale(LC_ALL, "");
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
07.01.2015, 06:28
Лучший ответ Сообщение было отмечено вячеслав77 как решение

Решение

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
//----------------------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <Windows.h>
 
char *RUS(const char *str)
{
    static char buf[BUFSIZ];
    OemToCharA(str, buf);
    return buf;
}
 
//----------------------------------------------------------------------------
int main()
{   
    setlocale(LC_CTYPE, "Russian");
    
    //диалог с консолью
    std::string name;
    std::getline(std::cin, name);               //взяли с консоли
    name = std::string (RUS(name.c_str()));     //преобразовали
    std::cout << name;  //проверка - вывод в консоль
    
    std::cin.get();
    return 0;
}
//-----------------------------------------------------------------------------
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
07.01.2015, 07:15
Лучший ответ Сообщение было отмечено вячеслав77 как решение

Решение

setlocale() не везде срабатывает.
Опишу почему возникает такая ситуация. Консоль принимает/выдаёт данные через таблицу символов cp866, а в файле хранятся они в cp1251. Если принудить компилятор работать с cp866, то проблем с кирилическими символами не будет. Текст введённый через консоль сохраняется с использованием cp866 (символ переводится в цифру) выводится соответственно тоже с cp866 - всё ок. Если хранится в cp1251, то выводятся соответствующие символы из cp866 (символ переводится в цифру при помощи cp1251, а обратное преобразование при помощи cp866).
IrineK, код некорректно работает. Для корректного вывода надо обратно перевести.
1
 Аватар для EfimKR
57 / 30 / 13
Регистрация: 24.06.2014
Сообщений: 255
Записей в блоге: 1
07.01.2015, 12:40
Лучший ответ Сообщение было отмечено вячеслав77 как решение

Решение

Enno, пользуюсь вот таким способом:

C++
1
2
3
4
5
6
7
8
9
#include<windows.h>
 
int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    //  код программы
    return 0;
}
Но в свойствах консоли нужно выбрать шрифт Lucide Console (Правой кнопкой на верхней части консоли, где 3 кнопки окна находятся)
1
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
07.01.2015, 13:36
Я привык на линуксе писать. Там с этим париться не нужно
0
07.01.2015, 13:52

Не по теме:

Цитата Сообщение от wondermilk Посмотреть сообщение
Я привык на линуксе писать. Там с этим париться не нужно
поставьте на винду везде utf-8 дефолтной и не парьтесь также

0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.01.2015, 14:51
Цитата Сообщение от KOPOJI Посмотреть сообщение
поставьте на винду везде utf-8 дефолтной и не парьтесь также
KOPOJI, поделись опытом.
0
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 3
07.01.2015, 19:43  [ТС]
Цитата Сообщение от wondermilk Посмотреть сообщение
Я привык на линуксе писать. Там с этим париться не нужно
Не могу пользоваться Линуксом, хотя тоже уже не однократно советовали.
Цитата Сообщение от KOPOJI Посмотреть сообщение
поставьте на винду везде utf-8 дефолтной и не парьтесь также
Поделитесь пожалуйста опытом.
Цитата Сообщение от wondermilk Посмотреть сообщение
Обычно подключают #include <clocale> и пишут, в начале main, setlocale(LC_ALL, "");
не помогло, более того-
1. подключал в начале файлы:
C++
1
2
3
4
5
#include <clocale>
#include <locale.h>
#include <wchar.h>
#include <sstream>
#include <Windows.h>
2. В начале тела функции main() ставил строки:
C++
1
2
3
4
5
6
7
8
setlocale(LC_ALL, "Russian");
setlocale( LC_ALL, "" ); 
setlocale(0, "");
setlocale(0, "RU");
setlocale( LC_ALL, "C" ); 
setlocale( LC_ALL, "ru-Ru" );
setlocale( LC_ALL, ".ACP" );
setlocale( LC_ALL, "<<language>_<country>");
Поочередно вставлял подключаемые файлы и строчки Setlocate(), что бы перебрать все, варианты.
Не чего не помогло.

Цитата Сообщение от Enno Посмотреть сообщение
setlocale() не везде срабатывает.
Опишу почему возникает такая ситуация.
Спасибо большое за разъяснение ситуации, не наткнись на ваш ответ, не когда бы не понял в чем проблема. Спасибо.

Цитата Сообщение от EfimKR Посмотреть сообщение
Enno, пользуюсь вот таким способом:
Спасибо большое помогло, 2 строчки добавил, изменил в свойствах язык и все стало как надо.

Enno, EfimKR
Есть ли еще способы для устранения проблемы такой? в приоритете такие способы, чтоб другому пользователю не приходилось залазить в настройки консоли и тп. Что бы только программно и работало в любом случае.

IrineK, Простите у меня не так много знаний пока что, не могу разобрать ваш код, а объяснить мне тоже пока что не кому, по этому пока сам не под наторею, разобраться не смогу что там написано ((( Честно отдаленно понимаю что там написано но много вопросов, что там в коде. Поможете разобраться? В принципе уже есть один рабочий способ) Потом может поумнею пойму. Всем спасибо за помощь!
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
07.01.2015, 19:56
Цитата Сообщение от Enno Посмотреть сообщение
IrineK, код некорректно работает. Для корректного вывода надо обратно перевести.
Где?
Зачем?
Миниатюры
Неправильный вывод кириллицы в строках, заданных с консоли  
1
07.01.2015, 21:01

Не по теме:

каким опытом поделиться? я линуксоид, мне и так неплохо)
Я лишь имел ввиду, что дело не в ос, а в кодировке.

0
 Аватар для EfimKR
57 / 30 / 13
Регистрация: 24.06.2014
Сообщений: 255
Записей в блоге: 1
07.01.2015, 21:23
вячеслав77, только есть одно но, если нужно вывести символ по коду, то нужно смотреть соответствующую таблицу для 1251.
И работает это только с Lucida Console.
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.01.2015, 21:28

Не по теме:

Цитата Сообщение от KOPOJI Посмотреть сообщение
каким опытом поделиться? я линуксоид, мне и так неплохо)
Зачем тогда пустые советы давать?



Добавлено через 3 минуты
Цитата Сообщение от вячеслав77 Посмотреть сообщение
в приоритете такие способы, чтоб другому пользователю не приходилось залазить в настройки консоли и тп. Что бы только программно и работало в любом случае.
Вот стпособ без настройки шрифта в консоли:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Шрифт точечный. Русский ввод и вывод без  настройки шрифта (берётся по умолчанию)
// В Code::Blocks не будет работать (отсутствует кодировка 866 )
 
#include <cstdlib>
#include <string>
#include <windows.h>
using namespace std;
 
int main ()
{    
    setlocale(0, "");
    cout << "Русский ввод!" << endl;
    
    SetConsoleCP(1251);
    string str;
    cin >> str;
    SetConsoleCP(866); 
    
    cout << str << endl;
    
   system("pause");
   return 0;
}
1
07.01.2015, 21:40

Не по теме:

Цитата Сообщение от lss Посмотреть сообщение
Зачем тогда пустые советы давать?
Вторую строчку вы не прочитали? А зря.

0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.01.2015, 22:25
Вот способ через опции компилятора (mingw):
В Compiler settings, Other options, прописать:

-finput-charset=CP1251 -fexec-charset=CP866

Кодировки будут правильно работать и без setlocale() и без SetConsoleCP() и т.д.

Добавлено через 38 минут
В студии, без настройки шрифтов, вот такие варианты работают:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <locale>
 
using namespace std;
 
 int main()
 {
     setlocale(LC_CTYPE,".866");
     wcout << L"Русский вывод" << endl;
     
     wstring wstr;
     getline(wcin, wstr);
 
     wcout << wstr << endl;
 
     system("pause");
     return 0;
 }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <locale>
 
using namespace std;
 
 int main()
 {
     wcout.imbue(locale("rus_rus.866"));
     wcin.imbue(locale("rus_rus.866"));
 
     wcout << L"Русский вывод" << endl;
     
     wstring wstr;
     getline(wcin, wstr);
 
     wcout << wstr << endl;
 
     system("pause");
     return 0;
 }
2
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 3
08.01.2015, 00:03  [ТС]
Цитата Сообщение от EfimKR Посмотреть сообщение
вячеслав77, только есть одно но, если нужно вывести символ по коду, то нужно смотреть соответствующую таблицу для 1251.
И работает это только с Lucida Console.
Понятно спасибо) буду разбираться, пока что не понятно.
lss, IrineK Спасибо еще раз, за коды
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
08.01.2015, 03:48
Цитата Сообщение от IrineK Посмотреть сообщение
Где?
Зачем?
В MSVS setlocale() сработал. В Codeblocks не сработал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2015, 03:48
Помогаю со студенческими работами здесь

Неправильный парсинг строки и неправильный её вывод
Добрый день! Столкнулся с непонятным поведением парсера: На вход подается вот такая строка: Далее, я делаю ее парсинг вот...

Ввод кириллицы в консоли
Есть задание создать некоторую базу. Базу эту можно дописывать. Но возникает проблема ввода кириллицы с консоли. Пробовал это решить...

Считывание кириллицы из консоли
Не могу проверить существование файла, если в строке №16 считывается кириллица. В отладчике значение строки отображается непонятными...

Чтение кириллицы из консоли
Всем добрый вечер. Собственно проблема: есть функция считывающая текст либо из файла, либо из консоли. Причем из файла кириллицу нормально...

Использование кириллицы в консоли
Ребят, программирую в QT Creator, почему-то не могу подключить русский язык в консоли! setlocale(LC_ALL,&quot;Rus&quot;); добавляю, но...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru