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.