do while循环中的getchar()

时间:2013-12-27 11:21:36

标签: c getchar

我正在尝试编写一个程序,使用箭头键选择一个选项,然后使用回车键选择它。问题是,我已经研究过这个问题,就是getchar()需要(第二个)输入击键来选择选项。在研究这个问题时,我没有找到解决问题的方法。这是(部分)代码:

        .....
        system("/bin/stty --file=/dev/tty -icanon");
        ch = getchar();
        switch (ch) {
            case 66:  // up arrow
                value += 1;
                if (value > numOptions-1) { value = numOptions-1; }
                break;
            case 65:  // down arrow
                value -= 1;
                if (value < 0) { value = 0; }
                break;
        }
    } while (ch != 13);      // Our termination cond: then hit enter.

....
const char *options2[]={"option1", "option2", "option3", "option4"};
const char *selected2[]={"OPTION1", "OPTION2", "OPTION3", "OPTION4"};
....

确定。我终于解决了这个问题显然,文本文件导致程序以某种方式无法正确解析回车。毕竟Getchar确实有效。谢谢大家的帮助。

3 个答案:

答案 0 :(得分:2)

不应使用getchar(),而应使用getch()。因为getchar()在按下回车键后接受char。

答案 1 :(得分:1)

我推荐ncurses库。

来自this neat ncurses guide

  

没有回音。如果您调用了noecho(),则不会在屏幕上打印字符ch,否则会打印出来。禁用自动回显可让您更好地控制用户界面。

     

没有缓冲。如果你已经调用了cbreak(void),那么用户点击的每个键都会被getch()立即返回。否则,用户点击的键将排队,直到读取换行符。然后调用getch()以FIFO方式从队列中获取字符,直到队列为空并读取下一整行。

     

特殊键。如果你已经调用了键盘(stdstr,TRUE),那么如果用户点击一个特殊的键,如Delete键,箭头键,Ctrl组合键和功能键,将返回单个int值。 [...]要使用这些键,您需要检查getch()的返回值。例如:

    int ch = getch();
    switch (ch) {
         case KEY_BACKSPACE: /* user pressed backspace */ 
            ...
         case KEY_UP:  /* user pressed up arrow key */
            ...
         case KEY_DOWN:  /* user pressed up arrow key */
            ...
         case 'A' ....   /* user pressed key 'A' */
            ...
    }

阅读上面提到的整洁指南应该提供您需要的所有见解;但如果你有任何疑问,请不要犹豫。

答案 2 :(得分:0)

您可以手动读取输入中的一个字符。

psedo代码:

int main(){
   char buf;
   int fd = open(0, READ); // can't remember if open input is necessary 
   while (read(fd, buf, 1)) {
      doStuff(buf);
   }
}

此外,您可能希望执行非阻塞读取。这样每个按键都会发送到您的程序:

int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);