Как установить кодировку на ввод и вывод без 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.