我正在尝试编写一个程序,使用箭头键选择一个选项,然后使用回车键选择它。问题是,我已经研究过这个问题,就是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确实有效。谢谢大家的帮助。
答案 0 :(得分:2)
不应使用getchar(),而应使用getch()。因为getchar()在按下回车键后接受char。
答案 1 :(得分:1)
我推荐ncurses库。
没有回音。如果您调用了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);