char someArray[n];
std::cin >> someArray; // potential buffer overrun
私が頻繁に訪れる C++ フォーラムで、上記のようなコードを何度も見てきました。これがコンパイル時エラーとして扱われない正当な理由はありますか? または少なくとも、警告ですか?
C (および C++) の基本的な前提は、コーダーが何をしているかを知っている必要があるということです。そうでなければ、彼らはBASICでコーディングしていたでしょう:-)
エラーが発生するのを待っているという事実にもかかわらず、C で許可されているのgets
と同じように、標準で許可されているため、エラーであることは許可されていません。scanf("%s")
あなたが投稿したコードは悪く、本格的なソフトウェアには適していませんが、「おもちゃ」のプログラムやテストには問題ありません。その問題を認識する必要があるだけです (そして、それはあなたがそれらを認識しているように聞こえます)。
C ++がすべて一挙に発明されたとしたら、おそらくまったく存在しなかったでしょう。文字列を読みたい場合は、それをに読み込む必要がstd::string
あり、それで終わりです。
残念ながら、C ++は、std::string
標準化される(またはまったく発明される)前にかなり長い間使用されていました。operator>>
とistream::getline
(誤解されないように)の両方std::getline
がその間に発明されました。それらが発明されたとき、実際の代替手段はほとんど(またはまったく)なかったので、charの配列で動作しました。
もちろん、今日では代替案があります。優れた代替案をサポートしていない古いコンパイラでコードを書くことに行き詰まらない限り、これらを避けるのが最善です。