2009-04-17 21 views
1

ユーザーから5文字の文字列を受け入れる必要があります(5文字のみ)。 使用する必要があります文字列を入力する/文字列の長さを確認する必要があります(C++)

istringstream 

同じですか?

私はこれで何かを取り除くことはできませんか?

int main() 
{ 
    char *InputMain; 
    InputMain=(char *)malloc(5+1); 
    cout << "Enter the number : " <<endl; 
    cin.getline (InputMain, 5, '\n');    // Input goes into InputMain 
    cout << "The number entered is : " << InputMain <<endl; 
    cin.get(); 
} 

そして、次の部分は、私は、ユーザー入力のみ5文字を確認してください

How'd ..来ますか?ユーザーが5文字以上入力すると、5文字しか入力できないという警告が表示されるはずです。

これは本質的に文字列であるため、文字列内の各文字を解析し、それぞれのASCII値(数字用)と照合することで解決できます。

+0

これは宿題のように聞こえます – lothar

答えて

4

残念ながら、C++で入力される文字数を制限する移植性のある方法はありません。しかし、あなたが使用しているどのプラットフォームであれ、何らかの仕組みが提供されます。たとえば、Windowsの場合、Console functionsを参照してください。

あなたはcinから、昔ながらのC++のiostream入力して行くのならば、それはistream& getline(istream&, string&)を使用してstd::stringに最初のテキストを読んですることをお勧めします - string Sは、必要に応じてサイズを変更するので、これは、バッファオーバーフローを防止します。 (getline(InputMain, 5, '\n')を含むあなたのコードは、InputMainに5文字以上を読み込まないという点で技術的には安全ですが、このコードは脆弱です。後で6文字を入力すると、malloc()への更新を忘れてしまいます。あなたがgetline(cin, str)またはいくつかのプラットフォーム固有のを使用してstringに入力を読み込むかどうか

:構文解析について

)クラッシュに私が言ったようにまた、あなたの代わりにstringを使用し、free(InputMain)に覚えておく必要があります。しかし。。。コードには、一度そこにあなたが番号の形でそれを取得する必要があります。 istringstreamクラスが有用であるところである - それはあなたがフォーマットされた入力>>演算子使用できるようにあなたは、読み取り元のストリームとして既存のstringを扱うことができます:あなたはC++のiostreamを使用している場合

string str; 
if (!getline(cin, str)) { 
    cerr << "Something went seriously wrong...\n"; 
} 

istringstream iss(str); 
int i; 
iss >> i; // Extract an integer value from the stream that wraps str 

if (!iss) { 
    // Extraction failed (or a more serious problem like EOF reached) 
    cerr << "Enter a number dammit!\n"; 
} else if (i < 1000 || i > 9999) { 
    cerr << "Out of range!\n"; 
} else { 
    // Process i 
} 

を、あなたは実際にだけではなく、stringistringstreamを経由して行くのcinから直接抽出することができます。

int i; 
cin >> i; // Extract an integer value from cin 

しかし、これは微妙な望ましくない影響を持つことができます。特に、ユーザーが入力した行の追加文字(特に、Enterキーを押したときに入力される'\n')は、次の<<操作で読み取る入力バッファーに残ります。多くの場合、これは問題ではありませんが、時にはそうなります。あなたがキーボード入力を待つことを期待してcin.get();をフォローアップすれば、それは'\n'(またはユーザが入力した最初の非数字文字)を読むだけです。

+0

このようなものを使用する必要がありますか? #include #include using namespace std; int main() { string InputMain; cout << "番号を入力してください:" << endl; getline(cin、InputMain); // cin >> InputMain; // --->これはうまくいくでしょうか? cout << "入力された番号:" << InputMain << endl; cin.get(); } – halluc1nati0n

+0

@ halluc1nati0n:申し訳ありませんが、私は1つのアプローチではなく2つの代替アプローチを行っています。私は物事を明確にするために投稿を修正しようとします。 –

+0

@ halluc1nati0n:OK、今見てください。要するに:いいえ、 "cin >> InputMain;"を使わないでください。 - "int i; cin >> i"を使用するか、または "文字列s; getline(cin、s); int i; istringstream iss(s); iss >>"; " –

関連する問題