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

Объяснение кода листинга программы

  1. В функции InpKbrd происходит ввод строки с клавиатуры в кодировке OEM.
  2. Переменная String является указателем на строку, которую необходимо заполнить.
  3. Переменная Length является указателем на переменную, в которую будет сохранена длина введенной строки.
  4. В цикле do...while происходит считывание символов с клавиатуры и преобразование их из кодировки OEM в ASCII с помощью функции OemToCharA.
  5. Введенный символ выводится на экран с помощью функции _putch.
  6. Если введенный символ является символом новой строки (13), то цикл прерывается.
  7. После окончания цикла выводится символ новой строки (13) для перехода на новую строку.
  8. Длина введенной строки сохраняется в переменной i.
  9. Строка, введенная с клавиатуры, выводится на экран с помощью функции puts.
  10. Если длина введенной строки совпадает с указанной длиной (Len), то выводится символ новой строки (13) для перехода на новую строку.
  11. Длина введенной строки сохраняется в переменной Length.
  12. С помощью функции memcpy_s копия строки, введенной с клавиатуры, сохраняется в переменной String.
  13. Если длина строки, введенной с клавиатуры, превышает значение переменной Len, то она обрезается с помощью функции strlen.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы