C ++での安全な入力
あなたのプログラムでは、ユーザーに情報を要求する必要があるかもしれません。 C ++では、情報は "cin"オブジェクトを使用して収集されます。 あなたがこれらの入力を保護しなければ、あなたのプログラムは「バッファオーバーフロー」の犠牲になる可能性があります。 実際、入力された文字数が当初予定されていたバッファサイズを超えると、最後のデータがスタック上の他のデータを上書きし、誤ったデータがESPおよびEBPレジスタに影響します。
これらのデータ入力をさまざまな方法で保護することができます。
get()メソッドを使う
#include int main(){char texte [100]; cin.get(texte、100); //プレミアパラメータ:laoùva la saisie秒:taille max de saisie return 0; }
この例はcin.getの使い方を示しています。
入力したテキストが割り当てられたサイズを超えると、余分な文字は無視されます。
"getline()"メソッドを使う
このメソッドはget()のように機能しますが、バッファの最後にある文字を削除します。
確かに、テキストを検証するために、ユーザーは「 \ n 」文字に対応する「Enter」キーを押します。
getline()はこの文字を削除します。
==動作しません!! ===
これは正しく動作しないコードです。
#名前空間stdを使用します。 int main(){char entree [100]; int choix; cout <> choix; cout << "Entrez un texte:"; cin.get(texte、100); cout << "Saisiesterminées!"; 0を返します。 }
実際、2番目のエントリは実行されず、「Input done!/ Saisiesterminées!」というメッセージが表示されます。
この問題を解決する方法は?
あなたは " ignore() "メソッドを使わなければなりません。
ignore()メソッド
このメソッドは文字列内の特定の文字を無視することを可能にします。
#名前空間stdを使用します。 int main(){char entree [100]; int choix; cout <> choix; cout << "Entrez un texte:"; cin.ignore(1、 '\ n'); // lecaractèred'entréeを無視し、qui validait auparavant la saisieを無視します。 cin.get(texte、100); cout << "Saisiesterminées!"; 0を返します。
この方法では、入力文字は無視され、問題は解決されました。