プロが教える店舗&オフィスのセキュリティ対策術

 そもそもcinについてあまり詳しい事は知らないのですが
よろしくおねがいします。
 cinを使って整数を取りこもうとする時、数字以外が
入ってしまうとおかしな動作をします。

 例えば「10未満の整数値を取りこむまで続くループ」で
入力部分を作ろうとした時に、

while(1){
 cout << "入力してください" << endl;
 cin >> int_a;
 if(int_a < 10) break;
}

大体 以上の様に書くと、入力する時にアルファベットが
入ってしまうと

入力して下さい
入力して下さい
…(エンドレス)…
入力して下さい

となってしまいます。cinをあきらめてscanfにしてみると
今度は実行時エラーがでてしまいます。
 整数を入力する事が出来て、なおかつアルファベットが
入力されても' 'で囲った値が入るようにするには
どのようにすればよいでしょうか?

A 回答 (5件)

失礼しました


1でしているような
エラーのクリアとデータの破棄を忘れていました

#include <iostream>
using namespace std;

void main(void)
{
int int_a;

while(true)
{
cout << "入力してください" << endl;
cin >> int_a;
if(cin.good()==0)
{
cout<<"変なものを入力しないでください"<<endl;
cin.clear();
cin.seekg(0);
break;
}
cout<<int_a<<"が入力されました"<<endl<<endl;
if(int_a < 10) break;
}
}

この回答への補足

 入力のチェックやデータの破棄に使ってるメンバ関数(言葉あってます?)
が1とは異なりますが、同じ動作が得られるものなのか
それとも処理系による差なのか自分の知識では及びませんが
そこは調べてみようと思います。

補足日時:2003/04/13 06:33
    • good
    • 0
この回答へのお礼

 無作法ですが2の方とまとめてお礼を言わせてもらいます。
ありがとうございました。

お礼日時:2003/04/13 06:33

アルファベットが入力されても' 'で囲った値が入るようにするにはどのようにすればよいでしょうか?



//gomi29.cpp
#include <iostream>
#include <string>
using namespace std;

void main(void)
{
intint_a;

while(true)
{
stringstr_a;
cout << "入力してください:";
cin >> str_a;
if(cin.good()==0)
{
cout<<"変なものを受信"<<endl<<endl;
cin.clear();cin.seekg(0);
}
else
{
cout<<str_a<<"を受信"<<endl;
if(str_a=="quit")break;
int_a=
atoi(str_a.substr(str_a.find('\'')+1).c_str());
int_a++;
cout<<"入力+1="<<int_a<<endl<<endl;
}
}
}

//結果

C:borland>gomi29
入力してください:3
3を受信
入力+1=4

入力してください:abc'3'd
abc'3'dを受信
入力+1=4

入力してください:abc
abcを受信
入力+1=1

入力してください:abc'd'e
abc'd'eを受信
入力+1=1

入力してください:quit
quitを受信
入力+1=1

C:borland>

//数字が無い場合にはatoiは0を出力
    • good
    • 0
この回答へのお礼

 atoiの引数が複雑ですね。
何度もありがとうございます。
 今回は特に気合を入れて組ませてもらいます。

お礼日時:2003/04/13 22:26

#include <iostream>


#include <string>
using namespace std;

void main(void)
{
while(true)
{
stringstr_a;
cout << "入力してください:";
cin >> str_a;
if(cin.good()==0)
{
cout<<"変なものを受信"<<endl<<endl;
cin.clear();cin.seekg(0);
}
else
{
cout<<str_a<<"を受信"<<endl<<endl;
if(str_a=="quit")break;
}
}
}

とすれば数字でも文字でも取り込めます
整数型にするにはatoiを使えばいいでしょう
    • good
    • 0
この回答へのお礼

3度目の助言、感謝します

お礼日時:2003/04/13 22:20

#include <iostream>


using namespace std;

void main(void)
{
intint_a;

while(1)
{
cout << "入力してください" << endl;
cin >> int_a;
if(cin.good()==0)
{
cout<<"変なものを入力しないでください"<<endl;
break;
}
cout<<int_a<<"が入力されました"<<endl<<endl;
if(int_a < 10) break;
}
}
    • good
    • 0

while( 1 )


{
std::cout
<< "入力してください"
<< std::endl;

std::cin
>> iGotData;
if( !std::cin.fail() ) // 整数値が入力されました。
break; //ループから抜けます。

// 整数値以外が入力されました。
std::cin.clear(); // エラーをリセットします。
std::cin.ignore( 1024, '\n' ); // 文字列を破棄します。
}

というような判定部分を入れてやればいいのでは?
    • good
    • 0
この回答へのお礼

 早速の回答をありがとうございます。cinにも色々な
関数が用意されてるのですねぇ。それらの仕様もあれば
言う事なしなのですが、そういうのが載ってるページは
ありそうなので探してみます。
 ありがとうございました。

お礼日時:2003/04/13 06:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング