質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

15027閲覧

stringで空白ありで数字を扱う || 数字を空白ありで複数入力

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/01/27 21:16

string str;

getline(cin,str);
入力>> "100 50 70"
の時それぞれint型のa,b,cに入れるにはどうすればいいですか?

またint型で打ち込む数字の個数が不特定の場合
"100 50 70"のようにうちこめますか?

scanfやcinでは決まった個数しか打ち込めないので困ってます

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
Eki

総合スコア429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/28 23:21 編集

stringstreamとcinの方法どちらもわかりやすく 回答ありがとうございました おかげで解決しました 皆さんの方法も知れたのでみなさんありがとうございました
guest

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

wandbox

投稿2018/01/28 02:35

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2018/01/28 01:02

vc++15.1 は許してくれたけど...規格ではそぉかも。
guest

0

投稿2018/01/27 21:58

編集2018/01/28 00:14
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eki

2018/01/27 23:54

つづりは split では?
hichon

2018/01/28 00:14

google先生が訂正してくれました
Eki

2018/01/28 00:19

ですね。くだらないことで失礼しました笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問