5

我正在尝试制作一个暂停用户输入的简单命令。我认为它在 Bash 脚本中会很有用。

这是我的代码:

#include <stdio.h>
int main() {
  char key[1];
  puts("Press any key to continue...");
  fgets(key,1,stdin);
}

它甚至不会暂停用户输入。

我之前尝试过使用 getch() (ncurses)。发生的事情是,屏幕一片空白,当我按下一个键时,它又回到了原来的屏幕上,我看到:

$ ./pause
Press any key to continue...
$

这有点像我想要的。但我想要的只是相当于pauseDOS/Windows 中的命令(我使用 Linux)。

4

3 回答 3

15

来自 GNU C 库手册:

功能:char * fgets (char *s, int count, FILE *stream)

fgets 函数从流中读取字符直到换行符(包括换行符),并将它们存储在字符串 s 中,添加一个空字符来标记字符串的结尾。您必须在 s 中提供 count 个字符的空格,但读取的字符数最多为 count − 1。额外的字符空间用于在字符串末尾保存空字符。

因此,fgets(key,1,stdin);读取 0 个字符并返回。(阅读:立即)

使用getchargetline代替。

编辑:一旦流上有可用的字符,fgets 也不会返回count,它会一直等待换行符,然后读取count字符,因此在这种情况下,“任何键”可能不是正确的措辞。

您可以使用此示例来避免行缓冲:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch ( void ) 
{
  int ch;
  struct termios oldt, newt;
  
  tcgetattr ( STDIN_FILENO, &oldt );
  newt = oldt;
  newt.c_lflag &= ~( ICANON | ECHO );
  tcsetattr ( STDIN_FILENO, TCSANOW, &newt );
  ch = getchar();
  tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
  
  return ch;
}

int main()
{
    printf("Press any key to continue.\n");
    mygetch();
    printf("Bye.\n");
}
于 2012-05-13T21:50:12.357 回答
2

我不确定如何在帖子下添加评论,所以这不是真正的答案而是评论,

在 linux 中,Stdin 是缓冲的,因此您需要刷新它,这就是在终端上按“enter”所做的。您似乎想从无缓冲的流中读取数据,即您想立即对按键做出反应(无需显式刷新它)。

您可以使用文件描述符创建自己的无缓冲流,然后使用“getc”从中读取,您可能必须使用 termios 来设置其他人建议的无缓冲输入。

于 2012-05-14T06:21:16.593 回答
1

这是一种在 Windows 10 上对我有用的简单方法:

#include <stdlib.h>

void pause(void);

int main(void)
{
    printf("Testing pause.");
}

void pause(void)
{
    system("pause");
}
于 2020-04-05T17:00:44.917 回答