一尘不染

等待用户在C中输入?

linux

我正在尝试制作一个暂停用户输入的简单命令。我认为在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)。


阅读 427

收藏
2020-06-07

共1个答案

一尘不染

从GNU C库手册:

函数:char * fgets(char * s,int计数,FILE * stream)

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

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

使用getchargetline代替。

编辑:count流中有可用字符时,fgets也不会返回,它会一直等待换行符,然后读取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");
}
2020-06-07