等待C中的用户输入?

big*_*107 3 c linux

我正在尝试创建一个暂停用户输入的简单命令.我认为它在Bash脚本中很有用.

这是我的代码:

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

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

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

$ ./pause
Press any key to continue...
$
Run Code Online (Sandbox Code Playgroud)

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

ccK*_*Kep 11

从GNU C Library手册:

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

fgets函数从流中读取字符,直到并包括换行符,并将它们存储在字符串s中,添加空字符以标记字符串的结尾.您必须在s中提供值空间的计数字符,但读取的字符数最多为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");
}
Run Code Online (Sandbox Code Playgroud)