2012-02-08 11 views
1

私は、クラスのLinuxターミナルで実行するシェルアプリケーションを設計し始めています。Cでのコンソール入力の長さを制限する:

これは、もちろん、可変長の入力文字列(コマンド)をユーザーから読み取ることを含みます。私は、各コマンドを適切なサイズのバッファに読み込むことができますが、これはコマンドを切り捨てるか、バッファオーバーフローを引き起こす可能性があります。

可能であれば、コンソールへのユーザー入力の長さをどのように制限できますか?私は3にコマンドの長さを設定している場合

セイ、123は許されるが、(ユーザが入力押した前)123は、すでに入力された文字列の中に存在し、ユーザーが4を追加しようと、何の文字が印刷されなかっなる場合コンソールに、おそらく「エラーping」があっても。

私はそのような機能を設計できることを認識していますが、それが必要な場合は、そのようなことをどこから始めるべきかわかりません。

私の独自のソリューションを実装するための既存のソリューションまたはアドバイスは、非常に高く評価されます。

編集:

私が入力した信号が到達したか、最大の長さに達するまで、安価で簡単な解決策は、一度に文字でコマンドを読むことであろうと仮定します。この種の解決策で問題が生じますか?

答えて

2

私はreadlineで少し経験を持っているが、ここであなたが試みることができるものです:あなたがより多くを許可する場合

  • はちょうど、rl_endをチェックする機能(rl_line_bufferの文字数)
    • を書きますそうでない場合rl_getc
    • を返し、あなたはrl_ding
  • 集合Tを使用することができます彼はサイドノートとして

前述したように、あなたの関数を呼び出すことrl_getc_functionあなたがreadlineを使用する場合、あなたは(それが行くようにライブラリがそのメモリを管理)すべての入力を制限する必要はありません。興味のある別の(より単純な)関数はgetlineです。

+0

ちょっとした適応で、これをかなりうまく機能させることができました。ありがとうございました!これが私の必要なものです。 –

2

コンソールの低レベルの制御は、Cのかなり基本的な組み込みI/Oモデルに含まれているものではありません。

Unixライクなシステムでは、ncursesなどのプラットフォーム固有のものを調べる必要があります。

+0

感謝。私は標準ライブラリや軽いカスタムソリューションのアプローチを探していましたが、ncursesを使用することは私の課題には適しているとは思えませんでしたが、私はその提案を感謝します。何も起こらなければこれを答えとして受け入れます。 –

0

あなたの編集に応じて、端末は通常、ラインバッファーになっています。ユーザーは入力せずに入力することができます。端末をrawモードまたはcbreakモードに設定できますが、プラットフォーム固有の領域に入っています。

代わりに、私はこの問題を避け、端末が200万年前のばかげた痕跡であると受け入れることをお勧めします。ほとんどのプラットフォームでは、LINE_MAXをプログラムが処理する必要がある最大行サイズと定義しています。それを超えて、あなたは単にあなたのユーザーがあなたをいじっていると仮定し、切り詰めることができます。

1

プラットフォーム固有のコントロールを掘り下げることなく、「Enter」を押す前にコンソールで使用する文字の数を制限することはできません。

あなたはになります。 doは、入力バッファに改行文字が存在するかどうかをチェックします。それがなければ、ユーザーは対処するよりも多くの文字を入力します。その入力を拒否し、改行が表示されるまで、stdinを繰り返し読み取ることができます。

例:あなたの答えのための

#include <stdio.h> 
#include <string.h> 
... 
char buf[SIZE]; 
... 
printf("Gimme something: "); 
fflush(stdout); 

if (fgets(buf, sizeof buf, stdin)) 
{ 
    char *newline = strchr(buf, '\n'); 
    if (!newline) 
    { 
    printf("Input too long: \"%s\"\n", buf); 
    while (!newline && fgets(buf, sizeof buf, stdin)) 
     newline = strchr(buf, '\n'); 
    } 
    else 
    { 
    // do something with buf 
    } 
} 
関連する問題