1. ホーム
  2. c

[解決済み] C言語でユーザー入力を待つ?

2022-01-28 08:10:25

質問

ユーザーの入力に対して一時停止する簡単なコマンドを作ろうとしています。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...
$

なんとなく思い通りになりました。しかし、私が欲しいのは pause コマンドをDOS/Windows(私はLinuxを使用しています)で使用することができます。

解決方法は?

GNU Cライブラリマニュアルより。

関数: char * fgets (char *s, int count, FILE *stream)

fgets 関数は、ストリームから文字を読み込みます。 を追加して文字列sに格納します。 文字が文字列の終わりを示します。文字数 文字分のスペースをsに入れる。 が、読み込まれる文字数は 最大でカウント-1 . 余分な文字スペースは、NULL 値を保持するために使用されます。 文字列の末尾にある

だから fgets(key,1,stdin); は 0 文字を読み取って返します。(読み方:ただちに)

使用方法 getchar または getline の代わりに

編集:fgetsも一度も返しません。 count 文字がストリーム上で利用可能になると、改行を待ち続け、その後に count という文字が表示されるので、この場合、"any key"は正しい表現ではないかもしれません。

これを使うことができます を使用すると、ラインバッファリングを回避することができます。

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