みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++:cinが上手く使えない

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

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

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

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

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

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

投稿日時 - 2003-04-13 01:53:32

QNo.521511

すぐに回答ほしいです

質問者が選んだベストアンサー

失礼しました
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;
}
}

投稿日時 - 2003-04-13 05:39:52

補足

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

投稿日時 - 2003-04-13 06:33:41

お礼

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

投稿日時 - 2003-04-13 06:33:29

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

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

//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を出力

投稿日時 - 2003-04-13 22:04:49

お礼

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

投稿日時 - 2003-04-13 22:26:48

ANo.4

#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を使えばいいでしょう

投稿日時 - 2003-04-13 06:38:20

お礼

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

投稿日時 - 2003-04-13 22:20:44

ANo.2

#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;
}
}

投稿日時 - 2003-04-13 05:22:54

ANo.1

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

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

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

というような判定部分を入れてやればいいのでは?

投稿日時 - 2003-04-13 03:54:06

お礼

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

投稿日時 - 2003-04-13 06:26:26