等待C中的用户输入?

时间:2012-05-13 21:43:27

标签: 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...
$

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

3 个答案:

答案 0 :(得分:10)

从GNU C Library手册:

  

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

     

fgets   函数从流流中读取字符,包括a   换行符并将它们存储在字符串s中,添加一个null   用于标记字符串结尾的字符。你必须提供计数   s中的空格字符,但是读取的字符数是   最多计数 - 1 。额外的字符空间用于保存null   字符串末尾的字符。

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

改为使用getchargetline

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

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

#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");
}

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

这是一种适用于Windows 10的简单方法:

a = np.array([[1, 2], [2, 3], [4, 5], [6, 7]])
a_t = a.T
print(a_t)
array([[1, 2, 4, 6],
       [2, 3, 5, 7]])