私が持っているコード:
int main(){
char readChars[3];
puts("Enter the value of the card please:");
scanf(readChars);
printf(readChars);
printf("done");
}
表示されるのは、ターミナルに値を入力してEnterキーを押した後、「完了」だけです。なぜですか。
編集:
scanfのプロトタイプではありません:
int scanf(const char *format, ...);
だから私はたった1つの引数でそれを使うことができるはずですか?
はい、scanf
1つのパラメータで呼び出すことが可能であり、場合によっては便利なこともあります。しかし、それはあなたが明らかに思っていたことをしません。(入力ストリームの引数の文字を期待してスキップします。)プログラマーとしてのデューデリジェンスを怠ったため、気づきませんでした。私はあなたがすべきことをリストします:
RTFM。 scanf
の最初のパラメータはフォーマット文字列です。変換シーケンスの一部ではなく、空白でもないプレーン文字は、文字通り入力で予期されます。それらは読み取られて破棄されます。それらが表示されない場合、変換はそこで停止し、予期しない文字が発生した入力ストリーム内の位置が後続の読み取りの開始になります。あなたの場合、おそらく入力から文字が正常に読み取られたことはありませんが、フォーマット文字列を初期化していないため、確実にはわかりません(以下を参照)。もう1つの興味深い詳細はscanf
、正常に読み取られたアイテムの数を示すの戻り値です。以下では、戻り値を確認することの重要性とともに説明します。
ローカルを初期化します。Cは、パフォーマンス上の理由からローカルデータを自動的に初期化しません(今日では、他の言語のようにユーザーの初期化を強制するか、自動初期化をデフォルトにして、問題が発生するいくつかの内部ループをオプトアウトする可能性があります)。初期化readchars
していないため、何が含まれているのかわからないためscanf
、入力ストリームで何が期待されているのかわかりません。その上、それはおそらく名目上未定義の振る舞いです。(しかし、あなたのPCでは、予期しないことは何もしないはずです。)
戻り値を確認してください。 scanf
あなたの例ではおそらく0を返しました。マニュアルには、scanfは正常に読み取られたアイテムの数(ここでは0)を返すと記載されています。つまり、入力変換は行われませんでした。このタイプの検出されない障害はscanf
、一連のトークンから1回限りのインデックスを読み取る可能性があるため、読み取り操作の長いシーケンスで致命的となる可能性があります。
我慢してください-私はいつもマニュアルを読んだり、戻り値をチェックしたり、(エラーによって)小さなテストプログラムの変数を初期化したりするわけではありません。しかし、それが機能しない場合、それは私の調査の一部です。そして、世界はもちろんのこと、誰かに尋ねる前に、私は自分が間違ったことを事前に見つけるために最善を尽くしたことを確認します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加