2012-01-10 19 views
3

私はちょうどC言語を学んでいて、今までJavaScriptやPHPなどの言語で作業していましたが、私の思考のステップをC言語の可能性に変換するのに問題があります。 (実際よりも大きく聞こえる)書き込みは、ユーザーがオプションを選択できる入力メニューを使用します。オプションには、今、私がやっている1、2またはユーザから1つの番号を取得する方法

3になります正常に動作します

int menu; 
scanf("%d", &menu); 

。ただし、文字列を入力すると問題が発生します。

私は単にオプションに対するメニューの変数に一致するだろうJavaScriptで:

if (menu != 1 && menu != 2 && menu != 3){ 
    menu = 4; // a switch later on will catch this. 
} 

をしかし、それは私がこれをアプローチする必要がありどのようにC.

で動作するようには思えないのですか?

答えて

5

あなたがエラーをチェックする必要があります

int menu; 
if (scanf("%d", &menu) != 1) 
{ 
    /* error */ 
    /* e.g.: */ menu = 4; 
} 

(。成功すると、scanfあなたが読みたかったアイテムの数を返します)あなたがエラーを処理する方法は、あなた次第です。有効な値になるまでループしたり、直ちに中断したり、変数をデフォルト値に設定したりすることができます。

代替方法として、入力行全体をfgetsで読み取ってから、それをトークン化して解釈します。 strtokおよびstrtolである。

+0

私はおそらくこの間違ったことを理解していますが、これはどのように使用しますか? 'Haha'のようなものを入力しても、メニュー変数は4に設定されません。 – Lg102

+1

あなたは質問していますか?私は理解していません...しかし、[この質問を参照してください](http://stackoverflow.com/q/8808145/596781)無効な入力の場合に入力をクリアすることについて。 –

2

scanf関数は、正常に読み取られた入力の数を返します。 (また、消費された文字の数を得るために%nフォーマットシーケンスがあります。)

いずれのソリューションも使用できます。

if (scanf(" %d", &menu) != 1) { 
    /* handle error */ 
} 

または多分:

int pos = -1; 
if (scanf(" %d %n", &menu, &pos) <=0 || pos <= 0) { 
    /* handle error */ 
} 

私の第二の例では、あなたの場合は本当に便利ではありません。しかし時々%nは非常に便利です。

%dの前にスペースを入れています.Cライブラリはスペースをスキップします。

関連する問題