2

重複の可能性:
stdinから文字を読み取るためのgetc Vs getchar Vs Scanf

getcharは、stdinからの入力として文字を受け取るマクロであることを私は知っています。ここで、scanfは、 stdinからの入力として任意のデータ型を受け取る関数です。getcharはマクロであるため、プログラムの実行速度を上げるのに役立ちますが、それでもgetcharの代わりにscanfを使用することをお勧めしますなぜ?


私はネットでscanfがgetcharと比較して安全であることを学びました、それで、scanfを安全にするものは何ですか?

4

3 に答える 3

1

私はあなたがそれらを作るのと同じくらい安全または危険である可能性があると主張しますが、最終的に私は使用することに決めscanf()ます:

  • scanf()呼び出しごとに複数の文字を処理するため、潜在的に高速です。

  • その動作は十分に文書化されています。つまり、フォーマット文字列にハードコードされた長さの制限を含めたり、ユーザー入力から生成されたフォーマット文字列を使用したりしないなど、セキュリティの問題を回避するための確立された方法があります。

  • scanf()はるかに使いやすいです-getchar()それ自体は「安全」かもしれませんが実際の機能を引き出すには、その周りに多くのコードを書く必要があります。scanf()によって提供される機能を複製し、セキュリティへの影響を確認する必要があるコード。実装は広範囲にわたってピアレビューされる可能性が高く、scanf()あなた自身のコードはおそらく決してそうではないでしょう。

  • のような標準関数を使用したコードscanf()は、カスタムライブラリに基づくものよりもはるかに簡単に保守できます。特に、スタッフの離職率が高いプログラミングチームではそうです。

于 2012-12-28T09:42:28.160 に答える
0

scanf一度に複数の文字を読み取ることができるため、高速です。

ただし、getchar一度に 1 文字しか読み取れないため、より安全です。入力がチェックされていない場合、を使用しているプログラムを悪用するのは比較的簡単scanfです。

于 2012-12-28T09:01:11.443 に答える
-2

getChar() は、私が知っていることと読んだことのような関数です。一部の Web サイトではマクロと呼ばれていますが、公式のC++ リファレンス Web サイトでは明らかに関数と呼ばれています。

getchar() は、キーボードから 1 文字だけ入力する必要がある場合に使用されますが、scanf() は複数の文字を取得するために使用されます。どちらが他より速いかは、要件と実装に完全に依存します。

安全性と使いやすさに関する限り、私は scanf() に投票します。複数の文字を入力でき、使用時に必須になる場合がある scanf() の使用後に flush() を使用する必要がないためです。 getchar()。

于 2012-12-28T09:57:17.263 に答える