gpt4 book ai didi

c - 如何正确读取C中的stdin?

转载 作者:行者123 更新时间:2023-11-30 14:59:21 25 4
gpt4 key购买 nike

我想写一个像 sgtpep/pmenu 这样的应用程序在 C 中。

然后我开始查看 ncurses图书馆。我的第一次尝试是选择菜单。比如当我这样做时ls | ./a.out ,它应该能够显示所有文件,并突出显示第一个文件,当我按 UPDOWN 时,它会相应地更改突出显示不同的项目。

完整代码为here .

程序不接收任何按键。 mvprintw(n+1, 0, "%d\n", ch);在循环内始终打印 -1 .

然后我删除不相关的代码,并获得最小的示例。

#include <stdio.h>

char buf[100];

int main(int argc, char **argv) {
int ch;

while (fgets(buf, sizeof(buf), stdin)) puts(buf);

ch = getch();
printf("%d\n", ch);
ch = getch();
printf("%d\n", ch);
ch = getch();
printf("%d\n", ch);
ch = getch();
printf("%d\n", ch);

return 0;
}

ch总是-1 。我怀疑stdin不干净,所以我使用 fflush(stdin)之后fgets ,但结果是一样的。

那么从 stdin 读取的正确方法是什么? ?

<小时/>

UPD1

#include <stdio.h>

char buf[100];

int main(int argc, char **argv) {
int ch;

while (fgets(buf, sizeof(buf), stdin)) puts(buf);

fflush(stdin);

ch = getchar();
printf("%d\n", ch);
ch = getchar();
printf("%d\n", ch);
ch = getchar();
printf("%d\n", ch);
ch = getchar();
printf("%d\n", ch);

return 0;
}

我修改了程序,所以与ncurses无关不再了,但是当运行 ls | ./a.out 时, ch一直显示-1 .

<小时/>

UPD2

使用newterm重定向inout有效。

FILE *fd = fopen("/dev/tty", "r+");
set_term(newterm(NULL, fd, fd)); // instead of initscr()
noecho();
cbreak();
keypad(stdscr, TRUE);

print_menu(cur, n);

while (true) {
ch = getch();

if (ch == KEY_UP || ch == 'k') --cur;
else if (ch == KEY_DOWN || ch == 'j') ++cur;

cur = (cur + n) % n;

print_menu(cur, n);
}

endwin();

最佳答案

如果您要以这种方式从stdin切换到curses,则必须打开终端设备,例如,/dev/tty已完成读取标准输入。打开终端后,您可以使用newterm初始化curses。 (它具有输入/输出流的参数,与 initscr 不同)。

有关示例,请参阅 ncurses test-program ,或dialog .

关于c - 如何正确读取C中的stdin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42823404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com