Ncurses и русские символы - C (СИ)
Формулировка задачи:
Здравствуйте! Прохожу основы интерфейса, с библиотекой ncurses/ncursesw. Есть одна проблема, с выводом массива с русскими символами. Если просто строку написать через printw("Привет, мир!"); русские буквы нормально отображаются, а массив не хочет.
#include <ncurses.h> #include <locale.h> /* Задание 4. Попрактикуйтесь в выводе символов в разных местах экрана. Попробуйте стирать или заменять уже напечатанные символы. */ /* прототипы функций */ int nc_start (void); void nc_end (void); /* главная функция */ int main (void) { setlocale(LC_ALL, ""); int ErrorCode; int i,j; int hello[12] = { 'H','e','l','l','o', ' ', 'w', 'o', 'r', 'l', 'd', '!' }; char * symbol[] = { "П","р","и","в","е","т", " ", "м", "и", "р", " ", "!" }; ErrorCode = nc_start(); // инициируем сессию ncurses if (ErrorCode == 0) // если проверка инициирования успешна { for(i = 0; i < 12; i++) { move(5+i, 30+i); printw("%c", hello[i]); refresh(); } for(j = 11; j > 0; j--) { move(5+j, 53-j); printw("%c", symbol[j]); refresh(); } nc_end(); // завершаем сессию ncurses } return ErrorCode; // передаем код завершения } /* начало */ int nc_start (void) { int code = 0; if(initscr() < 0) { code = -1; } // инициируем сессию ncurses с проверкой return code; } /* конец */ void nc_end (void) { move(23,0); // перемещаем курсор на последнюю строку printw("Press any key to continue..."); refresh(); // обновляем экран getch(); // ждем нажатия любой кнопки clear(); // очищаем окно stdscr refresh(); endwin(); // завершаем сессию ncurses return; }
Решение задачи: «Ncurses и русские символы»
textual
Листинг программы
int main (void) { setlocale(LC_ALL, ""); int ErrorCode; int i,j; int hello[12] = { 'H','e','l','l','o', ' ', 'w', 'o', 'r', 'l', 'd', '!' }; char * symbol[] = { "П","р","и","в","е","т", " ", "м", "и", "р", " ", "!" }; ErrorCode = nc_start(); // инициируем сессию ncurses if (ErrorCode == 0) // если проверка инициирования успешна { for(i = 0; i < 12; i++) { move(5+i, 30+i); printw("%c", hello[i]); refresh(); } for(j = 12; j --> 0; ) { move(5+j, 53-j); printw("%s", symbol[j]); refresh(); } nc_end(); // завершаем сессию ncurses } return ErrorCode; // передаем код завершения }
Объяснение кода листинга программы
- Устанавливаем локаль на все символы с помощью setlocale(LC_ALL, ``).
- Объявляем переменные:
- ErrorCode — для хранения кода ошибки;
- i, j — для работы в циклах;
- hello[12] — массив символов 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!';
- symbol[12] — массив строк
П
,р
,и
,в
,е
,т
,`,
м,
и,
р,
,
!`.
- Инициируем сессию ncurses с помощью nc_start() и проверяем успешность с помощью ErrorCode.
- Если ErrorCode равен 0, то выводим символы из массива hello с помощью move(5+i, 30+i) и printw(
%c
, hello[i]) в цикле от 0 до 11. - После этого выводим строки из массива symbol с помощью move(5+j, 53-j) и printw(
%s
, symbol[j]) в цикле от 12 до 0. - Завершаем сессию ncurses с помощью nc_end().
- Возвращаем ErrorCode с помощью return ErrorCode.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д