Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
вячеслав77
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 3
1

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

07.01.2015, 06:18. Просмотров 1108. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2015, 06:18
Ответы с готовыми решениями:

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

Неправильный вывод в консоли
Чому неправильно виводить на екран a.s a.bals каждый раз в другом месте...

Отображение кириллицы в консоли
Извеняюсь что не нашёл темы в форуме, просто поджимает время! #include...

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

Настройка отображения кириллицы в консоли
Здравствуйте! Подскажите пожалуйста где в найтройках вижуал студио нужно...

16
wondermilk
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
07.01.2015, 06:24 2
Обычно подключают #include <clocale> и пишут, в начале main, setlocale(LC_ALL, "");
0
IrineK
Заблокирован
07.01.2015, 06:28 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
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
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
07.01.2015, 07:15 4
Лучший ответ Сообщение было отмечено вячеслав77 как решение

Решение

setlocale() не везде срабатывает.
Опишу почему возникает такая ситуация. Консоль принимает/выдаёт данные через таблицу символов cp866, а в файле хранятся они в cp1251. Если принудить компилятор работать с cp866, то проблем с кирилическими символами не будет. Текст введённый через консоль сохраняется с использованием cp866 (символ переводится в цифру) выводится соответственно тоже с cp866 - всё ок. Если хранится в cp1251, то выводятся соответствующие символы из cp866 (символ переводится в цифру при помощи cp1251, а обратное преобразование при помощи cp866).
IrineK, код некорректно работает. Для корректного вывода надо обратно перевести.
1
EfimKR
55 / 28 / 13
Регистрация: 24.06.2014
Сообщений: 247
Записей в блоге: 1
07.01.2015, 12:40 5
Лучший ответ Сообщение было отмечено вячеслав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
wondermilk
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
07.01.2015, 13:36 6
Я привык на линуксе писать. Там с этим париться не нужно
0
KOPOJI
07.01.2015, 13:52
  #7

Не по теме:

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

0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
07.01.2015, 14:51 8
Цитата Сообщение от KOPOJI Посмотреть сообщение
поставьте на винду везде utf-8 дефолтной и не парьтесь также
KOPOJI, поделись опытом.
0
вячеслав77
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 3
07.01.2015, 19:43  [ТС] 9
Цитата Сообщение от 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
Заблокирован
07.01.2015, 19:56 10
Цитата Сообщение от Enno Посмотреть сообщение
IrineK, код некорректно работает. Для корректного вывода надо обратно перевести.
Где?
Зачем?
1
Миниатюры
Неправильный вывод кириллицы в строках, заданных с консоли  
KOPOJI
07.01.2015, 21:01
  #11

Не по теме:

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

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

Не по теме:

Цитата Сообщение от 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
KOPOJI
07.01.2015, 21:40
  #14

Не по теме:

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

0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
07.01.2015, 22:25 15
Вот способ через опции компилятора (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
вячеслав77
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 3
08.01.2015, 00:03  [ТС] 16
Цитата Сообщение от EfimKR Посмотреть сообщение
вячеслав77, только есть одно но, если нужно вывести символ по коду, то нужно смотреть соответствующую таблицу для 1251.
И работает это только с Lucida Console.
Понятно спасибо) буду разбираться, пока что не понятно.
lss, IrineK Спасибо еще раз, за коды
0
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
08.01.2015, 03:48 17
Цитата Сообщение от IrineK Посмотреть сообщение
Где?
Зачем?
В MSVS setlocale() сработал. В Codeblocks не сработал.
0
08.01.2015, 03:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2015, 03:48

Debug(отображение кириллицы в консоли)
проходим прогу дебаг,выводим свое имя,выводится на английском,какая програ...

Запись кириллицы в строку из консоли
Столкнулся с такой проблемой: если я пытаюсь заполнить строку из консоли, то...

Иероглифы при отображении кириллицы в консоли


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru