string str;
getline(cin,str);
入力>> "100 50 70"
の時それぞれint型のa,b,cに入れるにはどうすればいいですか?
またint型で打ち込む数字の個数が不特定の場合
"100 50 70"のようにうちこめますか?
scanfやcinでは決まった個数しか打ち込めないので困ってます
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
エラー処理などを厳密に考えないなら string を使わずに次のようにする手が手軽でしょう。
cpp
1int a, b, c; 2// 空白文字で区切られた数字を 3 つ取得 3std::cin >> a >> b >> c;
入力
text
15 3 2
に対して a == 5, b == 3, c == 2 となります。
個数がコンパイル時に不特定の場合でも、入力を受け付ける前に個数を入力させるなどができれば、先に個数を取ることで、 for 文で同様に解決できます。
cpp
1int n; 2std::cin >> n; // 個数が与えられる 3std::vector<int> v(n); 4for (int i = 0; i < n; i++) { 5 std::cin >> v[i]; 6}
入力
text
16 23 4 5 6 7 8
に対して v == {3, 4, 5, 6, 7, 8} となります。
それすらも分からない場合、 一行という区切りではなく入力の最後まで読むのでよければ 、std::cin.good()
を使うことで入力が正しく読まれたかが分かります (EOF につきあたった場合もこの関数は false を返します) ので、次のようにできます。
cpp
1std::vector<int> v; 2while (true) { 3 int t; 4 std::cin >> t; 5 if (!std::cin.good()) break; 6 v.push_back(t); 7}
入力
text
11 4 2 24 5 6 7 34 5
に対して v == {1, 4, 2, 4, 5, 6, 7, 4, 5} となります。
一行だけ読み取ってほしい場合は istringstream を使う手があります。 getline の結果に改行を付け加えてつっこみます。使い方はどちらも入力ストリームなのでほとんど同様です。
cpp
1std::string s; 2std::getline(std::cin, s); 3std::istringstream ss(s + "\n"); 4 5std::vector<int> v; 6while (true) { 7 int t; 8 ss >> t; 9 if (!ss.good()) break; 10 v.push_back(t); 11}
入力
text
13 4 5 28 6
に対して v == {3, 4, 5} となります。一行目のみ読むので、二行目はあってもなくても無視されます。
投稿2018/01/27 23:52
編集2018/01/27 23:57総合スコア429
0
こんにちは。
文字列と数値とのちょっと複雑目な変換をする時は、std::stringstreamが便利です。
C++
1#include <iostream> 2#include <sstream> 3 4 5int main() 6{ 7 std::string str("100 50 70"); 8 9 std::stringstream ss(str); 10 int a, b, c; 11 ss >> a >> b >> c; 12 13 #define PRINT(x) std::cout << #x "=" << x << "\n"; 14 PRINT(a); 15 PRINT(b); 16 PRINT(c); 17}
実行結果:
a=100 b=50 c=70
投稿2018/01/28 02:35
総合スコア23274
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C++
1#include <string> 2#include <sstream> 3#include <iterator> 4#include <iostream> 5#include <vector> 6 7using namespace std; 8 9int main() { 10 string str = "100 50 70"; 11 12 vector<int> data(istream_iterator<int>{istringstream(str)},istream_iterator<int>{}); 13 14 for ( auto item : data ) { 15 cout << item << endl; 16 } 17}
投稿2018/01/27 23:18
編集2018/01/27 23:25総合スコア16612
0
投稿2018/01/27 21:58
編集2018/01/28 00:14総合スコア5739
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/28 23:21 編集