我在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) {...}
答案 0 :(得分:2)
使用fgets读取一行。用sscanf解析该行。解析整数和尾随的非空白字符将允许检测整数后面的任何输入 编辑由于@ chux的评论而改进
cudart.so
答案 1 :(得分:1)
在纯标准C中,您想要的可能是不可能的(当然也是不明确的)并且不清楚。 C11标准n1570不知道终端或键盘(关于输入键),但仅约standard streams。另请参阅this回答您附近的问题。
实际上,如果你在某个POSIX系统上(我猜你在上),终端有一个由内核管理的line discipline。但是,标准输入可能不是终端(使用redirections或pipelines),您可以使用isatty(3)作为select
来检查是否为终端...
在这种情况下,我建议使用readline或ncurses这样的库。
顺便说一下,您对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以了解您的计划的行为。