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;                       // передаем код завершения
}

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

  1. Устанавливаем локаль на все символы с помощью setlocale(LC_ALL, ``).
  2. Объявляем переменные:
    • ErrorCode — для хранения кода ошибки;
    • i, j — для работы в циклах;
    • hello[12] — массив символов 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!';
    • symbol[12] — массив строк П, р, и, в, е, т, `,м,и,р, ,!`.
  3. Инициируем сессию ncurses с помощью nc_start() и проверяем успешность с помощью ErrorCode.
  4. Если ErrorCode равен 0, то выводим символы из массива hello с помощью move(5+i, 30+i) и printw(%c, hello[i]) в цикле от 0 до 11.
  5. После этого выводим строки из массива symbol с помощью move(5+j, 53-j) и printw(%s, symbol[j]) в цикле от 12 до 0.
  6. Завершаем сессию ncurses с помощью nc_end().
  7. Возвращаем ErrorCode с помощью return ErrorCode.

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


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

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

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