#c #linux #curses
#c #linux #проклятия
Вопрос:
Непрерывный ввод кода с помощью клавиш со стрелками. Почему на выходе многократный отступ?
Я пишу на C, используя библиотеку lncurses. Мне нужно получать непрерывный ввод с помощью клавиш со стрелками, но мой вывод странный и преднамеренный. Я попытался поменять n
r
местами, но тогда он вообще ничего не выводит, даже если он нажимает регистрационную клавишу.
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <curses.h>
#include <pthread.h>
void *input(void *arg)
{
printf("Thread runningrn");
int ch = 0;
while(1)
{
ch = getch();
switch(ch)
{
case KEY_UP :
printf("upn");
break;
case KEY_DOWN :
printf("downr");
break;
case KEY_LEFT :
printf("leftr");
break;
case KEY_RIGHT:
printf("rightr");
break;
}
}
return NULL;
}
void initcurses();
int main(int argc, char *argv[])
{
//Initialise ncurses library functions
initcurses();
pthread_t t_input;
pthread_create(amp;t_input, NULL, input, NULL);
pthread_join(t_input, NULL);
}
void initcurses()
{
//Initialise library
initscr();
//Enable control characters
cbreak();
//Disable getch echoing
noecho();
//Flush terminal buffer
intrflush(stdscr, TRUE);
//Enable arrow keys
keypad(stdscr, TRUE);
}
Я ожидаю увидеть, какая клавиша нажимается на новой строке каждый раз.
Вместо этого они имеют отступ.
Кода должно быть достаточно, чтобы воспроизвести результат. Скомпилируйте с cc -pthread -o file file.c -lncurses
Также некоторые примечания: KEY_UP
это единственное, что будет иметь какой-либо вывод из-за n
символа? Любые другие клавиши будут напечатаны после UP
нажатия после них.
Комментарии:
1.
"r"
против"n"
?2. что вы имеете в виду @Someprogrammerdude
3. Кажется, работает так, как ожидалось,
"upn"
создаст новую строку без возврата каретки,"downr"
выполнит возврат каретки в той же строке.4. @Groo итак, вы не получаете таблицы в консоли?
5. @Groo тьфу, кажется, это было простое решение. Когда вы сказали, что он делает то, что должен, я попытался выполнить n r, и теперь он переходит на новую строку и правильно начинается с начала.
Ответ №1:
Как указал @Groo, программа выполняла то, что я ей сказал.
Использование n создало новую строку точно после вывода, поэтому для правильного запуска ее с самого начала потребовался возврат каретки r.
Замена n или r на n r дает желаемый эффект.
Комментарии:
1. не только Груо, как сказал раньше какой-то чувак-программист 😉
2. Я так полагаю ? Я не совсем понимал, что он имел в виду, пока Груо не заговорил об этом. Но да, вы правы