2010-11-28 9 views
2

1文字を受け入れるCプログラムで簡単なメニューを作成したいと思います。メニューは次のようになります:C言語で1文字を受け入れるメニュー

  1. [S]プログラムが印刷されるか
  2. [E] XIT

ユーザーが '1'、 'S' または 'S' を入力した場合 " Hello "を入力して再度入力を促します ユーザーが '2'、Eまたは 'E'を入力すると、プログラムは終了します。 それ以外の場合は、「無効な入力」が表示され、再度プロンプトが表示されます。

私はプログラムを作成することができますが、ユーザーが12,13,14,15,16などと入力すると、1から始まり、Helloと他のオプションも同じように表示されます。

私のコードは次のとおりです。

#include <stdio.h> 

void clearBuffer(); 


int main() { 

    int i = 0; 
    char selection; 

    do 
    { 
     printf("\t1. [S]how\n"); 
     printf("\t2. [E]xit\n"); 
     printf("Enter your selection from the number or character noted above: "); 
     scanf("%s", &selection); 
     clearBuffer(); 

     if (selection == '1' || selection == 's' || selection == 'S') 
      printf("Hello"); 
     else if (selection == '2' || selection == 'E' || selection == 'x') 
      i = 0; 

} while(i != 0); 



} 

void clearBuffer() 
{ 

    while(getchar() != '\n'); 

} 
+0

標準ライブラリにないI/O機能が必要になる可能性がある場合は、ユーザーインターフェイス(文字モードでさえ)で作業することが重要です。これが学習の練習であれば、プラットフォーム固有の関数や、より直ちにインタラクティブなI/Oをサポートする移植可能なAPIを検討することもできます。実際には、IIRCがあなたのメニューを扱う 'curses'のような移植可能なライブラリを使うほうが良いでしょう。私は自分で使っていませんが。私はTurbo Pascal用のテキストモードのUIライブラリを書いていました(多くの人が行ったことですが、ホイールを再発明するのは人気の趣味でした)が、私はそれをお勧めしません。 – Steve314

+0

'curses'は実際にはメニューシステムに使用するのに最適なライブラリですが、OPがここでやっていることよりも少し時間がかかります。もしオペレータがライブラリで作業していて、 'curses'に関係する他のすべてのセットアップ/クリーンアップをやっているなら、是非、それをどうぞ。これは宿題のように見えますが、プログラミング志向の人にとってはそれほど遠くないのかどうかは間違いありません。 @ user521815:この時点でCプログラミングをどの程度快適に使用できますか? – Will

答えて

2

あなたはscanfので返される文字列の長さをチェックし、1つの文字よりも長いエントリ拒否し、標準Cライブラリの一部である、strlenを使用することができます。

また、getchar()を使用してユーザーからの文字を1つだけ受け入れることができます。つまり、Enterキーを押す必要はありません。

+0

あなたはまだ 'getchar()'でEnterを押してください –

+0

ありがとう、これは働いた –

3

あなただけの1文字を受信しようとしている場合)(GETCHARのためのscanf()関数を置き換えることを検討機能:

printf("Enter your selection from the number or character noted above: "); 
selection = getchar(); 
1

は、すでに述べたように、あなたが唯一の文字をしたい場合、あなたはgetchar()を使用する必要があります。何らかの理由でscanf()を使用したい場合は、ではなく、"%c"という正しい形式が使用されます。

1文字を探している場合は、ifブロックがちょっと「忙しい」(読んだり、ぎこちない)ように見えることをお勧めします...スイッチは、より洗練された、よりエレガントな方法です(IMHO )。

/* something like this ... */ 
switch (selection) { 
    case '1': 
    case 's': 
    case 'S': 
    printf ("Hello\n"); 
    break; 

    case '2': 
    case 'e': 
    case 'E': 
    i = 0; 
    break; 
} 

ものの他のカップル...あなたは('s''S'は同じことを行います、つまり)文字の場合は読まれて気にしないならば、あなたがあなたの前に大文字にselectionを変換することができますif-ブロックまたはswitch-ブロックtoupper()を使用してください。また、これはスタイルの提案に過ぎません。終了フラグにiを使用しないでください。一般的なプラクティスは、カウンターやインデックスにijのようなものを使用することです。quit_nowまたはuser_doneのようなものを使用すると、変数の意味をより正確に伝えることができます。