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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

3回答

2798閲覧

c++ 区切り 入力

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2020/09/04 01:00

編集2020/09/09 11:40

前提・実現したいこと

以下の条件のプログラムを作成しています。
(1)キーボードから数値を複数入力が可能
(2)入力可能な文字は数値とカンマと半角スペースのみ
(3)カンマは数値の区切り

実行例1
入力:1,4, 21,6
出力:1,4,6,21

実行例2
入力:1 2,3,4,5
出力:2,3,4,5,12

実行例3
入力:1,,2,3,4
エラーで再入力させる

試したこと

「c++ 複数入力」や「c++ カンマ区切り」などで検索をして調べ、vectorを使い複数の入力をやっていますが、うまくいきません。正直全く分からない状態のため、質問させていただきました。

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

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

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

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

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

episteme

2020/09/04 01:10

- "12 34" に対し、得られるのは 1234 ですか? 12ですか? 34ですか? エラーですか? - "12,,34" に対し、得られるのは 12 と 34 ですか? 12 と 0 と 34 ですか? エラーですか?
退会済みユーザー

退会済みユーザー

2020/09/04 01:19

ご指摘ありがとうございます。"12 34"に対しては、1234の数値を受け取り、"12,,34"に対しては、エラーとして、再度入力を求めるです。この条件でプログラムを作成しています。質問に不備があり、申し訳ございません。
maisumakun

2020/09/04 01:48

うまく行かない、書きかけのコードはご提示いただけますか?
guest

回答3

0

こんにちは。

意外にC++はカンマ区切りを読み取るのが苦手(面倒)です。

①std::getlineで改行までの1行を読んで、②std::stringstreamに渡して、③再度std::getlineでカンマ毎に切り出すのが比較的スマートと思います。
標準入力から取得した文字列の分割

空白の削除は、①と②の間で1文字づつスキャンして空白のみ読み飛ばしつつ、新たな文字列へ入れていく(push_back)のが手っ取り早いだろうと思います。

投稿2020/09/04 03:41

Chironian

総合スコア23272

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

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

退会済みユーザー

退会済みユーザー

2020/09/04 05:13

ご回答ありがとうございます。 リンクも拝見させていただきました。 まずは文字列で読み取り、その後分割するがわかりやすいですね。 参考にさせていただきます。
guest

0

こんなのはいかがでしょうか?

C++

1#include <iostream> 2#include <sstream> // ostringstream 3#include <string> // getline, stoi 4#include <vector> 5#include <algorithm> // sort 6using namespace std; 7 8int main() 9{ 10 vector<int> vec; 11 string line; 12 while (cout << ">> ", getline(cin, line)) { 13 bool failed = false; 14 ostringstream oss; 15 for (char c : line) { 16 if (c >= '0' && c <= '9') oss << c; 17 else if (c == ',') { 18 if (oss.str().empty()) { failed = true; break; } 19 vec.push_back(stoi(oss.str())); 20 oss.str(""); 21 } 22 else if (c != ' ') { failed = true; break; } 23 } 24 if (!failed) { 25 if (oss.str().size() > 0) vec.push_back(stoi(oss.str())); 26 if (!vec.empty()) break; 27 } 28 vec.clear(); 29 cout << " Error. Try again\n"; 30 } 31 sort(begin(vec), end(vec)); 32 for (auto it = begin(vec); it != end(vec); ++it) { 33 if (it != begin(vec)) cout << ','; 34 cout << *it; 35 } 36 cout << '\n'; 37}

数値がオーバーフローする場合の再入力もあったほうがいいですか?

投稿2020/09/04 06:55

編集2020/09/04 07:04
kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2020/09/04 11:40

返信が遅くなり申し訳ありません。 ご回答ありがとうございます。 理想のプログラムでした。今回は数値のオーバーフローは考慮していません。後で自分で考え、実装してみます。 ostringstreamは初めて見ました。sstreamが文字列の入出力で重要みたいですね。
kazuma-s

2020/09/04 14:33

,12,34 は再入力ですが、12,24, は再入力になりません。これでもいいんでしょうか?
guest

0

たとえばこんなんでいいのかな?

C++

1#include <iostream> 2#include <future> 3#include <string> 4#include <vector> 5 6/* str から delim を探し、 7 その位置以降をstr にセットして 8 その位置以前を返す */ 9std::string token(std::string& str, char delim) { 10 std::string::size_type pos = str.find(delim); 11 std::string result = str.substr(0,pos); 12 if ( pos == std::string::npos ) { 13 str.clear(); 14 } else { 15 str = str.substr(pos+1); 16 } 17 return result; 18} 19 20int main() { 21 std::string input = "12,34 56,,78"; 22 std::vector<std::string> tokens; 23 // ','で切り分けた文字列群をtokensに求める 24 while ( !input.empty() ) { 25 tokens.emplace_back(token(input,',')); 26 } 27 // できたかな? 28 for ( std::string item : tokens ) { 29 std::cout << '[' << item << "]\n"; 30 } 31}

投稿2020/09/04 03:31

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2020/09/04 05:15

ご回答ありがとうございます。 他の回答と同様、文字列を分割するのが良いみたいですね。 こちらのプログラムも参考に作成してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問