我正在尝试创建一个暂停用户输入的简单命令。我认为它在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)。
答案 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个字符并返回。 (阅读:立即)
改为使用getchar
或getline
。
编辑:当流上有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]])