- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我昨天问了一个问题,你们帮了大忙。之后又出现了另一个问题,这次是关于 ncurses 的。每当我四处移动箭头 (<) 时,光标后就会弹出不需要的文本。 Image of ncurses output
现在的箭头在 p 右边的第一列。似乎我按下的任何键都会出现在光标之后。如果有不同,我会在 Cygwin 中运行该程序。
代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <ncurses/ncurses.h>
#define MAXWORDS 100
#define WORDLEN 11
#define DEBUG 0 // set to 0 to disable debug output
#define ARROW '<'
#define BLANK ' '
//PROTOTYPES
int readWords(char *wl[MAXWORDS], char* filename); // reads words from the file into wl and trims the whitespace off of the end
void trimws(char* s); //modifies s to trim white space off the right side
void printWords(char* words[20][5], int wordCount, int rows, int columns);
void draw_character(int x, int y, char use);
void read_dir(int* time, int* b_down, int* b_up, int* b_left, int * b_right, int* dir_down, int* dir_up, int* dir_left, int* dir_right);
void printSentence(char* sentence[MAXWORDS], int position);
struct arrowlocation{
int row;
int column;
}arrowloc;
int main(int argc, char* argv[]) {
char* wordlist[MAXWORDS];
char* sentence[MAXWORDS];
char space[]=" \0";
int wordCount;
int i=0,j=0,k=0;
int columns=5, rows;
int row=0,column=16; //initial position for '<'
int prevrow, prevcolumn;
int time, b_down, b_up, b_left, b_right, dir_down, dir_up, dir_left, dir_right;
int position=0;
wordCount = readWords(wordlist, argv[1]);
struct arrowlocation arrowloc;
arrowloc.row=0;
arrowloc.column=0;
//DEBUGGING
if (DEBUG) {
printf("Read %d words from %s \n",wordCount, argv[1]);
for (i = 0; i< wordCount; i++) {
printf("%s,", wordlist[i]);
}
printf("\n\n");
}
//Calculates number of rows needed
if ((((double)wordCount)/columns)>((double)(wordCount/columns))){
rows=(wordCount/5)+1;
}
else{
rows=(wordCount/5);
}
char* words[rows][columns];
//Converts the list of words to a 2D array table
for(i=0; i<rows; i++){
for(j=0; j<columns; j++){
if (k==wordCount){
break;
}
words[i][j]=wordlist[k];
k++;
}
}
//Starts ncurses screen
initscr();
refresh();
printWords(words, wordCount, rows, columns);
refresh();
draw_character(row, column, ARROW);
int c=0;
do{
refresh();
c = wgetch(stdscr);
refresh();
switch(c){
case 66:
//move the arrow down one
if((arrowloc.row)<20){
draw_character(row, column, BLANK);
row=row+1;
arrowloc.row=arrowloc.row+1;
draw_character(row, column, ARROW);
//mvprintw(27, 0, "arrow loc; row:%d column:%d",arrowloc.row, arrowloc.column);
refresh();
}
break;
case 65:
//move the arrow up one
if((arrowloc.row)>0){
draw_character(row, column, BLANK);
row=row-1;
arrowloc.row=arrowloc.row-1;
draw_character(row, column, ARROW);
//mvprintw(27, 0, "arrow loc; row:%d column:%d",arrowloc.row, arrowloc.column);
refresh();
}
break;
case 68:
//move the arrow left one
if((arrowloc.column)>0){
draw_character(row, column, BLANK);
column=column-15;
draw_character(row, column, ARROW);
arrowloc.column--;
//mvprintw(27, 0, "arrow loc; row:%d column:%d",arrowloc.row, arrowloc.column);
}
break;
case 67:
//move the arrow right one
if((arrowloc.column)<5){
draw_character(row, column, BLANK);
column=column+15;
draw_character(row, column, ARROW);
arrowloc.column++;
//mvprintw(27, 0, "arrow loc; row:%d column:%d",arrowloc.row, arrowloc.column);
}
break;
case 113:
//Left button adds word to sentence without space at end
//if (b_left==1){
sentence[position]=words[arrowloc.row][arrowloc.column];
position++;
printSentence(sentence, position);
//}
break;
case 119:
//Up button adds word to sentence with a space at the end
//if (b_up==1){
sentence[position]=words[arrowloc.row][arrowloc.column];
position++;
sentence[position]=&space[0];
position++;
printSentence(sentence, position);
//}
break;
case 101:
//Down button acts as a backspace
//else if (b_down==1){
position--;
printSentence(sentence, position);
//}
break;
default:
//mvprintw(24, 0, "Charcter pressed is = %3d , c, c);
refresh();
break;
}
} while(1);
endwin();
}
void printSentence(char* sentence[MAXWORDS], int position){
int i=0, x=0;
//clrtoeol();
for(i=0; i<position; i++){
mvprintw(22, x, "%s", sentence[i]);
//mvprintw(23, x, "%d", i);
x+=strlen(sentence[i]);
}
refresh();
}
void printWords(char* words[20][5], int wordCount, int rows, int columns){
int k=0, i=0, j=0;
clear();
for(i=0; i<rows; i++){
for(j=0; j<columns; j++){
if (k<wordCount){
printw("%15s", words[i][j]);
k++;
}
}
printw("\n");
}
refresh();
}
void draw_character(int x, int y, char use){
mvaddch(x,y,use);
refresh();
}
void read_dir(int* time, int* b_down, int* b_up, int* b_left, int * b_right, int* dir_down, int* dir_up, int* dir_left, int* dir_right) {
int dummy;
scanf("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d,", time, b_down, b_up, b_left, b_right, dummy, dummy, dir_down, dir_up, dir_left, dir_right, dummy, dummy);
}
void trimws(char* s) {
int len = strlen(s) ;
int x;
if (len ==0) return;
x = len-1;
while (isspace(s[x]) && (x>=0)) {
s[x] = '\0';
x--;
}
}
int readWords(char* wl[MAXWORDS], char* filename) {
int numread =0;
char line[WORDLEN];
char *p;
FILE* fp = fopen(filename,"r");
while (!feof(fp)) {
p =fgets(line, WORDLEN, fp);
if (!feof(fp) && p !=NULL) {
trimws(line);
wl[numread] = (char *) malloc(strlen(line)+1);
strcpy(wl[numread], line);
numread++;
}
}
fclose(fp);
return numread;
}
如果您想自己编译并尝试,您将需要此文本文件 http://pastebin.com/xk0MmkEm您可能必须将案例结构中的数字替换为您的机器才能工作的数字。
运行它只是./program.exe wordslist.txt
最佳答案
自 <ESC>[B
以来,您的终端定义似乎是正确的是 CygWin 的光标向下转义序列,并且在运行代码时,它确实实际移动了光标。
然而,这些转义序列也出现的事实意味着它们来自某个地方,结果证明它们来自哪里是等式的输入端,而不是输出端。
当您按下向下箭头时,转义序列首先回显到屏幕,然后对输入进行操作,在输出 <
之前将光标移动到正确的位置。性格。
因此您需要在 initscr()
之后立即关闭 echo 调用:
initscr();
noecho(); // This line added.
refresh();
这将防止输入被回显。
现在您可能会在某些时候依赖回声完成(例如,对于常规字符),但我发现通常最好完全断开输入与输出的连接并在程序本身中进行映射。这样,您可以根据需要使映射变得简单或复杂。
换句话说,如果有人输入 e
, 确保 echo 关闭并输出 e
你自己而不是依靠 echo 为你做这件事。
关于c - Ncurses 在光标后显示不需要的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378930/
我正在用 C 和 C++ 编写 ncurses 程序。我还没有找到向用户隐藏光标的方法。我在互联网上查了一下,但我发现的大多数信息要么涉及 (n)curses 的 Python/Ruby 实现,要么实
我有我的 window WINDOW *win = newwin(40, 40, 3, 3); 当输入一些文本并跨越更多行时,保留窗口内边框周围整齐空白的最佳方法是什么?我似乎找不到在 NCurses
我使用 ncurses 创建了一个单窗口菜单方案并让它运行起来。当我添加第二个窗口时,我无法再触发我的 wgetch 调用(或者看起来是这样)。 函数原型(prototype)让我有些困惑: int
我一直在测试 ncurses,我尝试使用 Windows 编写一个简单的代码,通过阅读教程中的代码,在我看来,如果仅对一个窗口进行更改,调用 wrefresh() 就足够了。所以我尝试了以下代码,但它
我是一名初学者 C 程序员,我的一项任务要求我为 Logo 编程语言编写一个解释器。为此,我想知道是否有可能在使用 ncurses 库时将屏幕拆分,以便一半保留具有常规文本输入/输出的基本终端属性,另
在 ncurses 中捕获 control+key 的正确方法是什么? 当前我正在这样做定义控制,如下所示: #define ctl(x) ((x) & 0x1f) 它工作正常,但问题是我不能同时捕捉
有没有办法在mvwprintw中使用ANSI转义码? mvwprintw(window, 0, 0,"%c[%dmCOLORED_TEXT!\n", 0x1B, 32);//doesn't work
我以前问过这样的问题,但它有点误导,因为我没有包括打印顺序。自从我了解了整个概念的变化后,我认为再问一次会更合适。 #include using namespace std; in
我对 ncurses 比较陌生,只是想知道在我开始的 ncurses TUI 中显示在终端/命令行中执行的命令输出的简单方法是什么。即像这样的伪代码(我知道它不起作用,只是为了得到重点:)目标是呈现一
我正在使用 ncurses 在 C 中创建一个基于控制台的应用程序,它接受单个键输入但也读取组合键。例如,当用户同时按下 S 键和 F 键时,我希望它运行一些功能。是否有一些像 getch() 这样的
我试图通过将值 COLOR_BLUE 设置为 rgb 值(1000, 0, 0)来将文本 block 的背景设置为红色。如果我使用 Gnome 的“终端”应用程序,背景是正确的(红色),但如果我使用
main :: IO() main = runCurses $ do setEcho False w ev == EventCharacter 'q' || ev == EventChara
我需要使用 ncurses 实现一个简单的文本阅读器,有点像 unix 的 less。 我在理解如何操作时遇到问题。我目前有一个窗口,每次我按下向下键(例如)时,我都会在适当的起点刷新所有行,给人一种
为什么这段代码在这里: #include #define WIN 5 #define WI win[0] #define WC win[1] int ymax, xmax; WINDOW *win[
我正在使用 ncurses 构建我自己的终端。我的主窗口包含 5 个其他窗口。我位于下面的窗口是提示面板。我希望在那里输入文本,并且我也希望能够在那里输入文本。我已使用 wmove 定位光标,但光标仍
我正在尝试使用 ncurses 库在屏幕的特定点上色。 我写了这段代码: #include int main(void) { initscr(); start_color();
我正在使用 ncurses 为我的应用程序制作一个简单的 TUI。我掌握了创建和打印到窗口的基础知识,但我在输入方面遇到问题。 当我写完的时候,光标定位在我写的字符串的末尾 但是当我开始打字时,光标会
我有一个基本的 Linux 发行版,运行在一台连接激光的机器上。我想开发一个界面,它允许我: 配置激光设置(例如工具栏和按钮) 显示激光的当前路径(例如图形窗口) 因为这些是最基本的机器,所以我没有安
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我正在编写一个需要 ncurses 提供的高级终端控制的程序,但我无
我一直在尝试自学 ncurses,到目前为止我很喜欢它。但是,我正在尝试编写一个像 pico 或 nano 这样的小型文本编辑器。到目前为止,我已经设置得相当好。我创建了一个函数来映射键。无论我做什么
我是一名优秀的程序员,十分优秀!