2017-10-16 177 views
0

不要な入力を検出してプログラムを終了する必要があります。1文字のみのscanf

scanf("%c", &var);に1文字以上の文字列を入力すると、最初の文字がvarに格納されますが、プログラムは続行されます。

私はif (scanf("%c", &var) != 1)を使用しようとしましたが、入力に関係なく毎回1を返します。違いはありません。

私はfgets()のような他の関数をもっとよく知っているかもしれませんが、scanf()関数を使うように指示されています。

どうすればよいですか?

+2

'場合(scanf関数( "%Cは%のC"、&VAR、&エクストラ)== 2 &&余分な!= '\ n' は)' – BLUEPIXY

+4

注意入力された文字。しばしばより多く(文字が改行でない限り)。より正確に何をしようとしているのかを決定し、説明する必要があります。以前入力されたものは何ですか?キャラクターの後ろに何が入っていますか?あなたはそれについて心配するべきですか? (この最後のものへの答えは「はい」ですが、あなたが許可しているものと拒否しているものに注意する必要があります) –

+1

一般に、CとC++の両方で質問にタグを付けるべきではありません。学習している言語を選択し、他の言語で質問にタグを付けないでください。 –

答えて

-1

そして、あなただけの "conio.h" のscanfで

c = getch(); 

OR

( "%で定義された)(あなたのプログラムは、文字を入力した後に入力します使用getchは待つしたくない場合c "、& var);余分な文字を吸収するために、%cの後ろに改行文字\ nを追加することができます。

scanf("%c\n",&in); 
+0

'getch()'は**標準ではありません**。これは、MS-DOSの 'conio.h'とUnixのnCursesライブラリの2つの異なるバージョンを持っています。 – iBug

+0

はい、主な目的は問題を解決することでした。私は私のために働く2つの方法を与えました。私は問題を見ない! @iBug –

0

ユーザー入力を読み取るとき、scanfはファイルまたはコンソールから入力を受け取ることができます。

コンソールから読み取ると、データは改行が追加されたときにのみプログラムで使用できるようになります。つまり、同じ行に入力されたものはすべて読み込まれます。

while(!atGoalLocation()) { 
    printf("Which direction (f)orward (l)eft (r)ight?\n"); 
    scanf("%c", &dir); 
    processDirection(dir); 
} 

私は

f 
l 
f 
r 
f 
f 

として、または迷路のルートを入力することができますどちらか....私は迷路のプログラムを持っている想像し、それは私が行くためにどの方法を選択したいです

flfrff 

あなたの仕事によっては、同じことを意味する可能性があります。

これらの入力を許可したい場合は、scanfに ""を加えて空白を食べてください。

if(scanf(" %c", &dir) == 1) 

ラインブレイクバージョンが受け入れたい唯一の方法である場合は、ラインを区切り、スキャンを試みる必要があります。

我々は std::cinstd::coutを使用する必要がありますC++のためにも
char line[200]; 
while(fgets(line, sizeof(line), stdin) != NULL){ 
     sscanf(line, "%c", &dir); 

。しかし、同じ行の未読文字についても同様の問題が発生するため、私は引き続き行ベースのパーサを使用します。あなたは、通常の後、少なくとも改行を持ってしようとしていること

std::string line; 
while(std::getline(std::cin, line)){ 
    // here we could parse the line using std::strstream to decode more complext things than a char. 
    dir = line[0]; 
関連する問題