0
char someArray[n];
std::cin >> someArray; // potential buffer overrun

私が頻繁に訪れる C++ フォーラムで、上記のようなコードを何度も見てきました。これがコンパイル時エラーとして扱われない正当な理由はありますか? または少なくとも、警告ですか?

4

2 に答える 2

4

C (および C++) の基本的な前提は、コーダーが何をしているかを知っている必要があるということです。そうでなければ、彼らはBASICでコーディングしていたでしょう:-)

エラーが発生するのを待っているという事実にもかかわらず、C で許可されているのgetsと同じように、標準で許可されているため、エラーであることは許可されていません。scanf("%s")

あなたが投稿したコード悪く、本格的なソフトウェアには適していませんが、「おもちゃ」のプログラムやテストには問題ありません。その問題を認識する必要があるだけです (そして、それはあなたそれらを認識しているように聞こえます)。

于 2012-11-06T02:27:29.773 に答える
0

C ++がすべて一挙に発明されたとしたら、おそらくまったく存在しなかったでしょう。文字列を読みたい場合は、それをに読み込む必要がstd::stringあり、それで終わりです。

残念ながら、C ++は、std::string標準化される(またはまったく発明される)前にかなり長い間使用されていました。operator>>istream::getline(誤解されないように)の両方std::getlineがその間に発明されました。それらが発明されたとき、実際の代替手段はほとんど(またはまったく)なかったので、charの配列で動作しました。

もちろん、今日では代替案があります。優れた代替案をサポートしていない古いコンパイラでコードを書くことに行き詰まらない限り、これらを避けるのが最善です。

于 2012-11-06T03:02:28.837 に答える