今日、scanf() を使ったプログラムを書きました。プログラムは正しかったのですが、デバッグすると、Enter キーを押してもプログラムが入力を待っていて、別の数字/文字を押してからもう一度 Enter キーを押すまで結果が表示されませんでした。その瞬間、入力の計算値が表示されました。コードを調べたところ、書式指定子の後にスペースを入れていたことがわかりました。スペースを削除すると、うまくいきました。
`scanf("%d ",&a);`
この動作の理由は何ですか?
今日、scanf() を使ったプログラムを書きました。プログラムは正しかったのですが、デバッグすると、Enter キーを押してもプログラムが入力を待っていて、別の数字/文字を押してからもう一度 Enter キーを押すまで結果が表示されませんでした。その瞬間、入力の計算値が表示されました。コードを調べたところ、書式指定子の後にスペースを入れていたことがわかりました。スペースを削除すると、うまくいきました。
`scanf("%d ",&a);`
この動作の理由は何ですか?
あなたの質問への答えは、フォーマット指定子 (空白セクション) の説明にあります: http://www.cplusplus.com/reference/cstdio/scanf/
この関数は、次の非空白文字の前にある空白文字を読み取って無視します (空白文字には、スペース、改行、およびタブ文字が含まれます。isspace を参照してください)。フォーマット文字列内の単一の空白は、ストリームから抽出された任意の数の空白文字 (ゼロを含む) を検証します。
I/O はバッファリングされており、フラッシュする必要があります。
<stdio.h>
呼び出しなどでfflush(NULL)
またはfflush(stdout)
。fflush(3)および関連する man ページを読んでください。
C++ iostream では or を実行しますcout << std::flush
(cout.flush
または、jodagによってコメントされているように、改行を出力してからフラッシュする aを実行cout << std::endl
します)。std::flushなどについて読んでください。
またscanf("%d ",&a)
、リーダーは数字の直後に数字以外の文字を取得する必要があります(おそらくスペース、または行末またはファイルの終わりを取得します)。scanf(3)の man ページを読んでください。
あなたの前にstdoutをフラッシュすることをお勧めしますscanf
(常にではありませんが、自動的に行われる場合があります)
ところで、数値を入力する好ましい C++ の方法はおそらく
std::cin >> a;