在循环中,我需要暂停等待用户通过按回车键请求继续。
是否可以在循环中使用scanf()
函数暂停并等待用户按 Enter 继续?我需要的是像在RPG中一样,您需要按A
才能看到对话的其余部分。
根据我的测试,这个函数似乎是一个糟糕的暂停选择。
如果是这种情况,有没有其他方法可以在 C 中产生这种行为?
我的库中有这个函数:
void alx_wait4enter(void)
{
int c;
do {
c = getchar();
} while ((c != 'n') && (c != EOF));
}
它对我有用。
你只需调用它,它就会阻止直到输入:
foo();
alx_wait4enter(); // Block here until enter
bar();
alx_wait4enter(); // Block again
foobar();
AFAIK,它可以在进入之前正确处理垃圾输入,并且可以在循环或任何其他上下文中使用,即使在 ncurses 程序中也是如此。
getchar()会更好。如果您只想要一个阻止直到用户点击输入,这将是您成本最低、失败率最低的解决方案。您可以忽略结果。这个更新的答案是非常好的做...而循环在其他地方提供。
#include <stdio.h>
....
while(thing_is_happening) {
/* do some stuff */
for(int c = 1; c != 'n' && c != EOF; c = getchar());
/* do some more stuff */
}
是否可以在循环中使用
scanf()
函数暂停和等待 让用户按回车键继续?
假设标准输入连接到具有典型配置的终端,调用从标准输入读取的任何输入函数都将阻塞,直到按下 Enter 键,前提是输入缓冲区为空。 但是,如果它是非空的,那么它取决于缓冲区中已经有什么以及使用什么函数的详细信息。
根据您想要的内容,scanf()
可能是一个不错的选择,但涉及一些陷阱。 总体而言,scanf()
很难正确使用。
我需要的是RPG中的样子 您需要按 A 以查看对话的其余部分。
如果您从标准输入读取,则需要了解进入程序的典型终端行缓冲区数据。 这意味着它们将存储键入的字符,直到按下[enter]
或其缓冲区填充为止,并且仅在该点将数据发送到程序。 结果是等待任何按键都很棘手,但[enter]
.
另一方面,您必须注意在[enter]
之前按下其他键的可能性。 在这种情况下,您可能会选择做各种事情,但是如果您没有其他事情要做,那么您可能应该从输入中耗尽所有内容,直到到达换行符。
根据我的测试,这个函数似乎是一个糟糕的暂停选择。
您还没有描述您进行了哪种测试,但scanf()
很难正确使用。 尽管如此,我认为对于您要做的事情来说,这是一个不错的选择。 但是,需要注意的一点是,格式字符串中的换行符并不意味着"匹配一个换行符"。相反,格式字符串中一个或多个空格字符的任何运行都意味着"匹配零个或多个空格字符",并且函数在看到下一个非空格字符(或文件结尾)之前无法知道它已到达空格运行的末尾。
以下是我如何使用scanf
来等待[enter]
按键,并丢弃任何内容:
char c;
int n;
c = 0;
switch(scanf("%*[^n]%c", &c)) {
case 1: // a newline was scanned, corresponding to an [enter] keypress
assert(c == 'n');
break;
case 0: // the next character was a newline, or an error or EOF occurred
n = getchar(); // consume the newline
if (n == 'n') break; // else it was actually error or EOF
assert(n == EOF);
// fall through
case EOF: // end-of-file was reached or an I/O error occurred
break;
default: // should not happen
break;
}
scanf
格式准确地指定了我所描述的内容。%*[^n]
字段描述符表示匹配一个或多个非换行符的序列,但不将它们分配到任何地方。 这会吃掉下一个换行符之前的任何字符。 如果成功,则%c
读取以下字符,该字符必须是换行符。
scanf()
的返回值告诉您实际发生了什么 - 具体来说,匹配和分配了多少输入字段,或者在匹配任何内容之前发生文件结尾或 I/O 错误时EOF
的特殊值。 特别是,如果可用于scanf
的第一个字符是换行符,则任何内容都无法与第一个字段匹配,因此流中不会消耗任何内容,并且将返回 0。 在这种情况下,您必须尝试通过另一种机制使用流中的换行符,getchar()
在该角色中发挥了令人钦佩的作用。 返回值 1 表示至少匹配了一个非换行符(但未分配),然后匹配并分配了除换行符以外的任何字符。
由于只有一个字段的格式未禁止分配,因此唯一符合的返回值是0
、1
和EOF
。
但是,在看了一会儿之后,我可能会用这个代替它:
int c;
do {
c = getchar();
while (c != 'n' && c != EOF);
// ... optionally handle the c == EOF case here ...