Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 334
1

Кодировка консоли

05.06.2018, 17:27. Показов 1431. Ответов 3
Метки нет (Все метки)

Добрый день.

Не удается мне понять, что не так. Как только я не игрался с setLocale и различными типами данных (wchar_t)... Ближе к делу.

Задача: независимо от того используется кириллица или латиница в записную книжку должны добавляться записи!

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
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>     // для ввода\вывода консоли
#include <clocale>      // setLocale для определения кодировки консоли
#include <tchar.h>
 
using namespace std;
 
// https://habr.com/post/164193/ по поводу TCHAR
struct NOTE
{
    // имя
    TCHAR firstname[50];
    // фамилия
    TCHAR lastname[50];
    // телефон
    TCHAR telephone[50];
    // день рождения
    int birthday[3];
};
 
// вывод записей через консоль
void NodesPrint(NOTE notes[], int count)
{
    for (int i = 0; i < count; i++)
        wprintf(L"%ls | %ls | %ls | %i.%i.%i\n", notes[i].firstname, notes[i].lastname, notes[i].telephone, notes[i].birthday[0], notes[i].birthday[1], notes[i].birthday[2]);
}
 
// функция меняет местами два элемента по указателю
// т.е. меняет указатели
void NodesSwap(NOTE *xp, NOTE *yp)
{
    NOTE temp = *xp;
    *xp = *yp;
    *yp = temp;
}
 
// сортировка пузырьком
void BubbleSort(NOTE notes[], int count)
{
    int i, j;
    
    // цикл по всем элементам [0..n]
    for (i = 0; i < count - 1; i++)
        // цикл до i элемента  
        for (j = 0; j < count - i - 1; j++)
            // если текущий элемент больше чем следующий, то меняем местами
            if (notes[j].firstname[0] > notes[j + 1].firstname[0])
                NodesSwap(&notes[j], &notes[j + 1]);
}
 
int main(int argc, char **argv)
{
    // настройка локализации под UTF-8
    setlocale(LC_CTYPE, "rus");
 
    int n = 0;
    wprintf(L"%ls", L"Введите количество новых записей: ");
    cin >> n;
 
    // notes - указатель, который будет указывать на место в памяти, которое мы выделим для N записей
    NOTE *notes = new NOTE[n];
 
    for (int i = 0; i < n; i++)
    {
        wprintf(L"Введите Имя: ");
        wscanf(L"%ls", notes[i].firstname);
 
        //todo: дописать
    }
 
    BubbleSort(notes, n);
 
    NodesPrint(notes, n);
 
    return 0;
}
Только один раз у меня получилось сделать так, чтобы TCHAR firstname могла содержать в себе кириллицу, только когда setlocale(LC_CTYPE, "UTF-8"), но тогда не удается правильно отобразить вспомогательный текст, такой как "Введите Имя!; если setlocale(LC_CTYPE, "rus"), то имя "Владимир" хранится, как

Код
+		firstname	0x00831c08 L"‚«*¤Ё¬Ёа"	wchar_t[50]
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2018, 17:27
Ответы с готовыми решениями:

Кодировка в консоли(C)
Здравия Я к вам с очередной проблемой:)Читал сейчас тему русские шрифты в консоли и задался...

Кодировка в консоли
Добрый день , имея некоторый опыт программирования на c# решил так же изучить С++, однако при...

Кодировка в консоли VS
Есть код. В нем конструкция проверяющая введенные данные. (Типа примитивной авторизации)...

Кодировка в консоли VS
Здравствуйте! Проблема вот в чём: Необходимо, чтобы текст отображался точно также, как в...

3
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
05.06.2018, 17:31 2
Лучший ответ Сообщение было отмечено darksector как решение

Решение

C++
1
2
3
4
5
6
7
#include <windows.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
}
1
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 334
05.06.2018, 17:39  [ТС] 3
Да, проверил. На вывод консоли работает более менее хорошо, но в отладке "Владимир" храниться, как

Код
+		firstname	0x00e12230 L"Âëàäèìèð"	wchar_t[50]
Это не повлияет на дальнейшую сортировку данных?

Добавлено через 1 минуту
Да. Проверил сортировку, вроде все отлично. Спасибо.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
05.06.2018, 19:38 4
Цитата Сообщение от darksector Посмотреть сообщение
Только один раз у меня получилось сделать так, чтобы TCHAR firstname могла содержать в себе кириллицу, только когда setlocale(LC_CTYPE, "UTF-8")
Ничего у Вас не получилось.
setlocale не умеет работать с кодировками байтность которых больше 1.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2018, 19:38

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

Кодировка символов в консоли
Напомните ещё один способ установки кодовой страницы в консоли для визуал студии, по крайней мере...

Неправильная кодировка в консоли
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; const int strsize = 20; int main()...

Кодировка в консоли (на ЕГЭ)
В этом году буду писать экзамен, но дело в том, что в visual studio setlocale(LC_ALL,&quot;Rus&quot;); не...

Кодировка ввода вывода консоли под кириллицу и латиницу
Возникла необходимость одновременной работы кириллицы и латиницы в консоле.(ввод-обработка-вывод)...


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

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

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