Вы правы необходимо было разобраться и отлинковать с библиотекой
curses.n и параметром -lncursesw
Для этого понадобилось еще установить библиотеку
libncursesw5-dev (а я думал что libncursesw5 (без dev) достаточно).
Огромное спасибо всем!
Тему можно закрывать.
Кириллические кодировки в терминале это возможно?
Я вообще пробовал вывести на печать всю таблицу в кодах /001 /002 ... ./255
латиница отображается верно, а в кириллице что то не могу сказать.
ну так у вас ничего и не будет работать. таким кодам не соответствуют никакие буквы UTF-8, они двухбайтовые. Посмотреть код можно набрав
[console] echo "русский текст" | xxd -c1[/console]
Причем если не использовать initscr();
то все отлично с кириллицей.
может ваша либа ncurses собрана без поддержки UTF-8?
вот что нашёл:
[console]$ ncursesw5-config --cflags
-I/usr/include/ncursesw
$ ncursesw5-config --libs
-L/usr/lib -lncursesw
[/console]
(у вас может быть по другому. это и надо вставлять В ВАШУ команду сборки)
Если ваша версия ncurses собрана без поддержки UTF, то вам либо придётся пересобирать её самостоятельно, либо использовать KOI8-R.
libncursesw5-dev (а я думал что libncursesw5 (без dev) достаточно).
достаточно что-бы пользоваться вашей программой. но для сборки надо ещё и -dev.
Итак проблема решена и нужно подвести итоги.
Код программы почти не изменился:
#include <locale.h>
#include <curses.h>
char *loc;
int main() {
loc=setlocale(LC_CTYPE,"ru_RU.UTF-8"); /* setlocale(LC_ALL,""); */
initscr();
start_color();
init_pair(1, COLOR_RED, COLOR_BLUE);
attron(COLOR_PAIR(1));
move(10,31); printw("Буря мглою небо кроет,\n");
move(11,31); printw("Вихри снежные крутя.\n");
move(12,31); printw("То как зверь она завоет,\n");
move(13,31); printw("То заплачет, как дитя.\n");
move(14,31); printw(" А.С. Пушкин\n");
getch();
endwin();
return 0;
}
Для решения этой проблемы нужно было установить библиотеку
libncursesw5-dev
И компилировать с параметром -lncursesw
gcc myprog.c -o myprog -lncursesw
Отдельное спасибо bortmant, его советы оказались наиболее точными.
Проблема решена тему можно закрывать
Простите за нескромный вопрос, а "\r" тут зачем, да ещё в таком странном порядке "\n\r" (вместо "\r\n" принятого в dos/windows)?
printw("То заплачет, как дитя.\n\r");
printw("То заплачет, как дитя.\n\r");
а оно всё равно не помешает :)
хотя вы правы - лишнее... не аккуратно.
Просто книга по которой набираю программы написана для Win.
Вообще книг для совсем новичков по Си на платформе Линукс
я не нашел. Мне сейчас надо написать кучу пробных программ на Си
потому что на горизонте крупный заказ нужно на Си, знаю только PHP.
Вот и осваиваю. Си от PHP все-таки значительно отличается.
Можете подсказать книгу задач по Си где отрабатываются основные алгоритмы?
Лучше конечно специально под Линукс, но можно и для WINdows.
А ошибку я исправил.
На самом деле книжек по Си в контексте Unix/Linux вполне достаточно, чтобы зная азы С и азы Линукса начать что-то писать. Другое дело, что рынок С/С++ в контексте M$ Windows кишит подобной литературой. Но "много" совсем не означает "хорошо". В большинстве своем в этих про-Вендовых книжках информация повторяется, да плюс еще полно всяких низкопробных книжек.
А на самом деле, для старта я бы Вам порекомендовал всего две:
1. Керниган энд Ритчи, классика! http://www.books.ru/shop/books/559201 У это книжки статус "must-have"
2. Мэтью http://www.books.ru/shop/books/646220
Это две маленькие пони, которые помогут Вам в ваших вопросах. Можете заказать их на указанных сайтах. Я обычно так и делаю. Выходит иногда даже дешевле, чем в магазинах. Ну и зайдите на сайты, например:
Кениган и Ричи - это то что нужно для начинающего по ним я учусь на http://www.intuit.ru.
Простите за рекламу.
А книгу Метью я наверное куплю когда появится возможность.
Пока можно и linuxcenter "покушать" :-).
И opennet.ru тоже по делу.
Спасибо.
Просто книга по которой набираю программы написана для Win.
там надо писать просто \n, или \r\n.
это важно, если читать файлы в "блокноте". данная программа настолько тупая, что не умеет переводить карретку в начало строки.
потому получается "ёлочка". Ещё это зависит от "режима открытия файла". В венде есть "текстовый", а есть "двоичный". В первом венда лезет в файлы, и что-то там меняет. Это вообще очень сложная, нелогичная, и запутанная ОС.
В линуксе достаточно ставить символ \n, который означает "конец строки". хотя \r тоже есть, и он даже работает:
[console]$ printf "XYZW\rABC\n"
ABCW
[/console]
здесь сначала напечаталось XYZW, а потом, поверх XYZ пропечаталось ABC. Причём и в консоли, и в C это работает одинаково.
Кроме того, можно забыть про кодировки: если вы пишете программу с русскими буквами в KOI8-R, то она отлично будет работать что в GUI, что в консоли (если они конечно тоже в KOI8-R). Написав программу в UTF-8, вы получите рабочий вариант в UTF-8, ИЧСХ, он будет работать даже у китайцев и арабов. (в линуксе конечно. В венде будут кракозябры).