在while循环

时间:2015-05-22 21:22:55

标签: c linux ncurses

我正在编写一个程序,每次调整大小时都会在控制台上填充一个字母,当调整大小时,字母会更改为字母表中的下一个字母。

我也希望这样做,当用户按下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();
}

1 个答案:

答案 0 :(得分:1)

考虑到呼叫的组合,OP正在使用ncurses(而不是说另一个conio问题)。鉴于(一个完整的程序会有所帮助),开始pause()的块是没有意义的,因为如果有人记得使用

,ncurses将返回KEY_RESIZE
keypad(stdscr, TRUE);

在初始化部分,以及更新LINESCOLS值。程序的给定部分可以重写如下:

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调用修复了提到的阻塞问题。