95442


[一週間で身につくC++言語の基本](https://cpp-lang.sevendays-study.com/) というサイトの応用編の問題「4日目
STL」のページの、「probex4-4」という問題に取り組んでいます。コードの目的としては、文字列を配列に格納するループの中で何も入力せずエンターしたところでループを抜け次の処理に入るというものです。

元々while文で書いていたのですが、無限ループに入ってしまい強制終了してから取り敢えずfor文で簡易的に試しています。実際、挙動としては何も入力せずにエンターを押した後にbreakしてくれません。おそらくif文の条件が問題だと思うのですが、string型で「何も入力していない状態」がどのような状態なのかがうまく書けません。

とても初歩的なことだと思いますが、どなたかご教授お願いします。

**環境:**  
g++ 9.4.0  
WSL2 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

[code]

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        string str = "a";
        vector<string> v1;
        vector<string>::iterator i1;
    
        for (int i = 0; i < 5; i++)
        {
            cout << "入力";
            cin >> str;
            string s_str = str;
            if (s_str.empty())
            {
                cout << "無し";
                break;
            }
            else
            {
                v1.push_back(str);
            }
        }
    
        for (i1 = v1.begin(); i1 != v1.end(); i1++)
        {
            cout << *i1 << " ";
        }
        cout << endl;
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2023-07-02T04:15:59.743
95441
2023-07-02T08:40:31.463
2023-07-02T08:40:31.463
3060
52497
question
c++ string
ループ中にbreakでループを抜けられません


そもそも

[code]

    cin >> str;
    
[/code]

は１文字以上入力されるまで終了することはなく、プログラムは次の行にも進みません。つまり

[code]

    cin >> str;
    string s_str = str;
    if (s_str.empty())
    
[/code]

が次の行に進んでいる時点で、 `str` および `s_str` は空でなく、 `s_str.empty()` は `false` を返します。

というわけで

> ループ中にbreakでループを抜けられません

ループを抜けられないのではなく、そもそも`break`が書かれた行に到達することがありません。

* * *

「次の行にも進みません」という日本語が理解できていないようです。プログラムを次のように書き換えれば、何を言っているか理解できるでしょうか。

[code]

    cin >> str;
    cout << "read: " << str << endl; // この行を追加
    string s_str = str;
    if (s_str.empty())
    
[/code]

これで、「何も入力せずにエンターを押した」だけでは次の行に進んでいないことを理解できるかと。


CC BY-SA 4.0
2023-07-02T04:29:48.520
95442
2023-07-02T05:47:28.057
2023-07-02T05:47:28.057
4236
4236
95441
answer