2016-12-13 9 views
0

問題を示す簡単なCプログラムを作成しました。ここにあります。OS Xは矢印キーでターミナルキャレットを移動します

#include <stdio.h> 

int main(int argc, const char * argv[]) { 
    char buffer[128]; 
    memset(buffer, 0, sizeof(buffer)); 

    printf("Type data:\n"); 
    scanf("%126s", buffer); 

    printf("%s\n", buffer); 

    getchar(); 
    return 0; 
} 

問題は、アプリケーションがscanf関数(とユーザーの入力を待っているときということです)、ユーザの利用者は、彼が入力した行を編集して、矢印で移動キャレットをしたい、キャレットが移動しますが、新しい醜い入力されていません挿入されます。 enter image description here

何らかの理由で、私は何らかの理由でキーを処理しません。私は上のキーで前のタイプされた行に行くこともできません。

明らかにこの動作を有効にする必要があります。助言してもらえますか?どうすればいいですか?

+0

あなたが話していた種類のターミナル指向のI/Oを実行できるようにするには、ncursesライブラリ(またはそれに相当するOS X)を使用する必要があります。標準的なC入出力関数は文字ストリームを扱うので、端末から送られてくるエスケープ文字は扱えません。 –

+0

私はそのようなライブラリについて考えましたが、端末がこれを処理してはいけませんか?多くのアプリはそのような操作を可能にしており、すべてが非標準ライブラリを使用しているのは奇妙なようです。 – Ivan

+2

使用する標準ライブラリがないため、すべて非標準ライブラリを使用します。 –

答えて

2

readline()を使用してください。ここでは簡単な例です:

#include <stdio.h> 
#include <readline/readline.h> 
#include <readline/history.h> 
#include <ctype.h> 

#define MAX_LINE_LEN 80 

int main() { 
    char *line_buffer; 
    int n, i; 

    while (1) { 
    line_buffer = readline("Say something: "); 
    if (!line_buffer) break; 
    for (i=0; line_buffer[i]; i++) { 
     line_buffer[i] = toupper(line_buffer[i]); 
    } 
    printf("YOU SAID: %s\n",line_buffer); 
    } 
    putchar('\n'); 
    return 0; 
} 

/* (Compile with cc foo.c -lreadline -o foo) */ 
0

あなたが見ている問題は、矢印キーは確かにあなたが文字列を印刷するときに表示される特定の値にマッピングすることです。上記のreadline()ライブラリは、一度に1つずつ入力された文字を受け入れ、期待していた編集機能を実行するために矢印キーをキャプチャします。

関連する問題