2012-05-13 15 views
3

私は、ユーザー入力のために一時停止する簡単なコマンドを作ろうとしています。私はそれがBashスクリプトで役に立つと思う。それも、ユーザーの入力を一時停止していませんCでユーザー入力を待ちますか?

#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(私はLinuxを使用している)のpauseコマンドと同等です。 GNU Cライブラリのマニュアルから

+4

Bashでは、 'read'組み込み関数を使うことができます。 –

+0

[getchar()](http://stackoverflow.com/questions/9386651/pause-screen-at-program-completion-in-c)。 – kennytm

+2

http://stackoverflow.com/questions/92802/what-is-the-linux-equivalent-to-dos-pause – cnicutar

答えて

10

機能:するchar * fgetsの(のchar * sで、int型の数、ファイル*ストリーム)

関数fgets 関数は、ストリームから文字がストリーム最大読み込み 改行文字を含めて文字列sに格納し、文字列の末尾に0-文字を追加します。 には、 文字分のスペースが必要ですが、読み取られる文字数は最大でも - 1です。余分な文字スペースは、文字列の末尾にNULL 文字を保持するために使用されます。

したがって、fgets(key,1,stdin);は0文字を読み込んで返します。 (すぐにお読みください)

getcharまたはgetlineを代わりに使用してください。

編集:fgetsのは、ストリーム上で利用可能な、それは改行を待って保持し、その後、count文字を読み込み、その「任意のキー」は、この場合、正しい言葉遣いではないかもしれません一度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"); 
} 
+0

私が知る限り、標準入力はラインバッファーではありません。 – ccKep

+0

なぜ私の入力が意味をなさないのを待たなかったのですか?しかし、私は1つのキーが押されるのを待っているものが欲しい。これはncursesが便利な場所である。 – biggles5107

+0

だから私はちょうど 'read'を使うほうがいいと思います。 – biggles5107

2

私はポストの下にコメントを追加するかどうかはわかりませんので、これは本当に答えが、コメントはありませんが、

linuxでStdinはバッファリングされているので、それをフラッシュする必要があります。これはあなたの端末で 'enter'を押すことです。あなたがバッファリングされていないストリームから読み込みたい、つまり、即時にキー入力に反応したいと思うようです(明示的にフラッシュする必要はありません)。

ファイルディスクリプタを使用して独自のバッファリングされていないストリームを作成し、それから "getc"を使用して読み込むことができます。他の方法と同様に、termiosを使用してバッファリングされていない入力をセットアップする必要があります。

+0

あなたのコメントを入力できる答え/質問の下にボックスがあるはずです。 – biggles5107

+0

私にとっては私自身の質問でしかできませんが。 – biggles5107

+2

あなたがコメントできるようにするには、評判がある程度必要です(おそらく50 - 覚えていないかもしれません) –

関連する問題