C - 我可以使用scanf暂停循环,以便用户按回车键吗?



在循环中,我需要暂停等待用户通过按回车键请求继续。

是否可以在循环中使用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 表示至少匹配了一个非换行符(但未分配),然后匹配并分配了除换行符以外的任何字符。

由于只有一个字段的格式未禁止分配,因此唯一符合的返回值是01EOF

但是,在看了一会儿之后,我可能会用这个代替它:

int c;
do {
c = getchar();
while (c != 'n' && c != EOF);
// ... optionally handle the c == EOF case here ...

最新更新