我正在编写一个程序,每次调整大小时都会在控制台上填充一个字母,当调整大小时,字母会更改为字母表中的下一个字母。
我也希望这样做,当用户按下q时程序结束。这当前有效,但如果我没有输入任何字母,那么我的打印代码永远不会到达。我该如何解决这个问题?
while(1){
keyInput = getch();
if(keyInput == 'q' || keyInput == 'Q'){
break;
}
letter++; //Get next letter
if(letter > 90){
letter = 65; //Loop back to A
}
//Print updated output
pause(); //Wait for sigwinch
clear(); //Clear window
ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
resizeterm(ws.ws_row, ws.ws_col);
for(i = 0; i < ws.ws_row; i++){
for(j = 0; j < ws.ws_col; j++){
addch(letter);
}
}
refresh();
}
答案 0 :(得分:1)
考虑到呼叫的组合,OP正在使用ncurses(而不是说另一个conio问题)。鉴于(一个完整的程序会有所帮助),开始pause()
的块是没有意义的,因为如果有人记得使用
KEY_RESIZE
keypad(stdscr, TRUE);
在初始化部分,以及更新LINES
和COLS
值。程序的给定部分可以重写如下:
keypad(stdscr, TRUE); /* allow KEY_RESIZE to be read on SIGWINCH */
timeout(50); /* wait 50 milliseconds for each character */
while(1){
keyInput = getch();
if (keyInput == ERR) {
continue; /* ignore when there was a timeout - no data */
} else if(keyInput == 'q' || keyInput == 'Q'){
break;
} else if (keyInput == KEY_RESIZE) {
letter++; //Get next letter
if(letter > 'Z'){
letter = 'A'; //Loop back to A
}
erase();
move(0,0);
for(i = 0; i < LINES; i++){
for(j = 0; j < COLS; j++){
addch(letter);
}
}
}
}
timeout
调用修复了提到的阻塞问题。