如何在不按C键的情况下输入换行命令?

时间:2018-05-22 16:48:56

标签: c buffer newline

我在Linux上,使用C99,我的问题是:我编写了一个基于整数的多选项。对于超过第一次的每次迭代,输入比数组所需的更多的整数将触发其他菜单选项,因为它们保留在缓冲区中。 我想避免fflush(stdin)函数,因为我读它导致未定义的行为,所以我尝试使用while ((select = getchar()) != '\n'),但在第一次迭代中,我需要按Enter键才能显示菜单。我可以向缓冲区发送换行符以避免此问题吗? 另外,我将select声明为int

以下是导致问题的代码部分:

for(;;) {
    while ((select = getchar()) != '\n') { }
    printf("\n\nWhat operation?\n1. Define array\n2. Delete element\n3. Add element\n4. Order array\n5. Randomize array\n6. Print array\n0. Exit\n");
    scanf("%d", &select);
    switch(select) {...}

2 个答案:

答案 0 :(得分:2)

使用fgets读取一行。用sscanf解析该行。解析整数和尾随的非空白字符将允许检测整数后面的任何输入 编辑由于@ chux的评论而改进

cudart.so

答案 1 :(得分:1)

在纯标准C中,您想要的可能是不可能的(当然也是不明确的)并且不清楚。 C11标准n1570不知道终端或键盘(关于输入键),但仅约standard streams。另请参阅this回答您附近的问题。

实际上,如果你在某个POSIX系统上(我猜你在上),终端有一个由内核管理的line discipline。但是,标准输入可能不是终端(使用redirectionspipelines),您可以使用isatty(3)作为select来检查是否为终端...

在这种情况下,我建议使用readlinencurses这样的库。

顺便说一下,您对stdin名称的使用令人困惑(因为select(2)是一个旧的系统调用,今天被poll(2)取代。)

如果您仅限于纯C标准功能,请仔细阅读 scanf的文档,并使用其返回计数。您当然不能(可移植地)将换行符(或任何其他字符)放入某些输入流(如gcc -Wall -Wextra -g)。但请仔细阅读ungetc

我建议编译所有警告和调试信息(所以<!--ko with: modelBList--> <ul data-bind="foreach: listItems"> <li data-bind="text: $data, click: $parent.clickMe"></li> </ul> <!--/ko--> with GCC)并学习use the gdb debugger以了解您的计划的行为。