Как установить кодировку на ввод и вывод без setlocale - C (СИ)
Формулировка задачи:
Как установить кодировку на ввод и вывод в простом си? Про setlocale() я знаю, это неполноценное решение. Нашёл решение проблемы только для си++, которое заключается в скрещивании широких символов и свойства imbue на ввод и вывод, с символами обычной ширины оно не работает почему-то.
#include <iostream> #include <locale> using namespace std; int main() { wcout.imbue(locale("rus_rus.866")); wcin.imbue(locale("rus_rus.866")); wstring name; wcout << L"Введите ваше имя: "; wcin >> name; wcout << L"Привет, " << name << L"!\n"; system("pause"); return 0; }
Решение задачи: «Как установить кодировку на ввод и вывод без setlocale»
textual
Листинг программы
void InpKbrd (char * String, unsigned char & Length) { unsigned char i = 0, Len = 255; char Str[256], Ch[2] = { 0, 0 }; printf("Введите предложение до %d символов и нажмите энтер: \n", Len); do { Ch[0] = _getch(); OemToCharA(Ch, &Str[i]); _putch(Str[i]); } while ((Str[i] != 13) && (++i <= Len)); Str[i] = 0; puts(""); if (i == Len) puts(""); Length = i; memcpy_s(String, Len, Str, strlen((char*)Str)); }
Объяснение кода листинга программы
- В функции
InpKbrd
происходит ввод строки с клавиатуры в кодировке OEM. - Переменная
String
является указателем на строку, которую необходимо заполнить. - Переменная
Length
является указателем на переменную, в которую будет сохранена длина введенной строки. - В цикле
do...while
происходит считывание символов с клавиатуры и преобразование их из кодировки OEM в ASCII с помощью функцииOemToCharA
. - Введенный символ выводится на экран с помощью функции
_putch
. - Если введенный символ является символом новой строки (
13
), то цикл прерывается. - После окончания цикла выводится символ новой строки (
13
) для перехода на новую строку. - Длина введенной строки сохраняется в переменной
i
. - Строка, введенная с клавиатуры, выводится на экран с помощью функции
puts
. - Если длина введенной строки совпадает с указанной длиной (
Len
), то выводится символ новой строки (13
) для перехода на новую строку. - Длина введенной строки сохраняется в переменной
Length
. - С помощью функции
memcpy_s
копия строки, введенной с клавиатуры, сохраняется в переменнойString
. - Если длина строки, введенной с клавиатуры, превышает значение переменной
Len
, то она обрезается с помощью функцииstrlen
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д