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

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

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

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

Q&A

解決済

3回答

2735閲覧

入力され続けていた文字列をすべて一旦listに格納し、最後に5文字以上のものを削除する。

sattsun

総合スコア25

C++

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

0グッド

0クリップ

投稿2020/03/15 14:23

【問題】
・コンソールから文字列を入力させ続けて、何も入力せずEnterを押すと、それまで入力した文字列の中から、5文字以上の単語以外のものがすべて表示されるようにプログラムを作りなさい。
・入力され続けていた文字列は、すべて一旦listに格納し、最後に5文字以上のものを削除してから表示しなさい
【欲しい結果】
文字列を入力:apple
文字列を入力:good
文字列を入力:pineapple
5文字未満の単語:good

下記箇所でエラーが出ていて、直し方が分かりません。
ヒントをいただきたいです。
size_t size = li[i].length();//ここで―エラが出ます。

【書いたコード】
#include <string>
#include <list>
using namespace std;
int main()
{
list<string> li;
string str{ "duumy" };
list<string>::iterator itr;

while (str != "") { cout << "文字列を入力:"; if (getline(cin, str) && !str.empty()) { li.push_back(str); } } unsigned int i; int str_size = 0; for (i = 0; i < li.size(); i++) { size_t size = li[i].length();//ここで―エラが出ます。 if (size < 5) { str_size = size; //cout << endl; //cout << "最大文字数:" << max_size <<" "; } } cout << endl; cout << "5文字未満の単語:"; for (itr = li.begin(); itr != li.end(); itr++) { if (str_size == li[i].length()) { cout << li[i] << " "; } } return 0;

}

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

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

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

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

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

t_obara

2020/04/01 06:42

すでに回答が出ていると思うのですが、どのような回答を望んでいるのでしょうか?
sattsun

2020/04/01 13:04

do~while文やautoが思いつかなかったので、もしそれらを使わずに今のコードを改造してできるのだったらそのやり方がいいなと思い回答をまだ求めているとしました。
thkana

2020/04/01 22:15

「エラーが出ます」ではなく、そのエラーメッセージや現象等を「そのまま」(あなたの解釈抜きで)記して下さい。 エラーメッセージは、「何が起こったのか」のレポートであり、それを適切に読めればそれだけで問題が解決してしまったりすることもしばしば、なくらい重要な情報です。決して「エラーが出た」で捨ててしまってよい情報ではありません。(読み取るのに多少訓練が必要かも知れませんが...) エラーメッセージは出なくて期待しない動作をする場合でも、「うまく動かない」ではなく、「(期待しないものであっても)どのように動いているのか」という情報はどのように間違っているのかについての重要なヒントになりうるものです。 質問をするのなら、それらをきちんと記載して下さい。 もう一つ、プログラムのソースコードはインデント(字下げ)をすることで非常に読みやすくなります(字下げが文法で決まっている言語もあります)。teratailでは、普通に記述した部分では字下げが失われますが、決まった手順を踏むことでインデントを保持したり、キーワードに色付したりすることができるようになっています。teratailのヘルプや https://teratail.com/questions/238564 を読んでみて下さい。
guest

回答3

0

ベストアンサー

auto も do while も使わないと、

C++

1#include <iostream> 2#include <string> 3#include <list> 4using namespace std; 5 6int main() 7{ 8 list<string> li; 9 string str; 10 list<string>::iterator itr; 11 12 while (cout << "文字列を入力: ", getline(cin, str) && !str.empty()) 13 li.push_back(str); 14 15 for (itr = li.begin(); itr != li.end(); ) 16 if (itr->length() < 5) ++itr; 17 else itr = li.erase(itr); 18 19 cout << "5文字未満の単語: "; 20 for (itr = li.begin(); itr != li.end(); ++itr) 21 cout << *itr << " "; 22 cout << endl; 23}

投稿2020/04/01 18:36

kazuma-s

総合スコア8224

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

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

kazuma-s

2020/04/05 03:43

この回答では満足できないのですか? どのような回答を望んでいるのでしょうか?
guest

0

こんなんでいかがすか

C++

1#include <iostream> 2#include <string> 3#include <list> 4 5int main() { 6 using namespace std; 7 8 list<string> words; 9 string str; 10 do { 11 cout << "文字列を入力:"; 12 str.clear(); 13 if ( getline(cin, str) && !str.empty() ) { 14 words.push_back(str); 15 } 16 } while ( !str.empty() ); 17 cout << endl; 18 cout << "5文字未満の単語:"; 19 for ( const auto& word : words ) { 20 if ( word.length() < 5 ) { 21 cout << word << " "; 22 } 23 } 24 return 0; 25}

投稿2020/03/16 00:16

episteme

総合スコア16614

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

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

0

std::listoperator[] を提供していません。 つまり、 [] という演算子を使えません。

投稿2020/03/15 15:03

SaitoAtsushi

総合スコア5437

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問