73716


C++でモールス信号を製作しようと考えています。ただ、空白を区切って出力ができません。どのように空白で区切ってそれぞれのモールスを変換できるでしょうか。

一度だけの入力と出力なら受け付けていました。ただし、空白を開けてもう一度続けてモールスを入力してもそのままのモールスが返ってきました。どうすれば空白ごとで変換できるでしょうか。お願いします。

[code]

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string morce;//入力するモールスの変数
        string alpha;//変換したときのアルファベットの入れ物の変数
    
        cout << "暗号を入力してください\n";
        getline(cin, morce);
    
        for (int i = 0; i < 100; i++) {//それぞれ入力されたモールスを空白が押されるまでの変換
    
                if (morce == "・－")
                {
                    morce = 'a';
                }
    
                if (morce == "－・・・")
                {
                    morce = 'b';
                }
    
    
        }
    
        cout << morce << endl;//すべて入力し終わったとき出力
    
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2021-01-31T01:27:42.777
73710
2021-01-31T07:47:29.430
2021-01-31T05:36:36.470
19110
34680
question
c++
空白で区切られた入力を処理したい


質問に提示されたソースコードは、以下の問題があります。

  * 先ず問題なのは、`for`文の中でどれも入力された文字列全体を判定している(`if (morce == "・－")`等)ことです。

  * そして次に問題なのは、入力された文字列自身を置き換えている(`morce = 'a';`等)ことです。

  * これは副次的な問題として、変数`alpha`が`変換したときのアルファベットの入れ物の変数`とコメントされて定義されているのに、何にも使われていないことにつながります。  
最後の出力も変数`morce`が使われています。

  * それから、`for`ループの制御が`0`から`100`未満となっているけれども、それ自身には意味が無い処理であることです。

* * *

その上で、質問の主題である「空白で区切られた入力を処理したい」については、コメントで紹介した記事の最初の回答にあるように、`stringstream`を使うことで実現出来るでしょう。  
[C++ Morse to english](https://stackoverflow.com/q/59013166/9014308)  
該当部分

>
[code]

>     #include <sstream>
>     // ... 途中省略 ...
>         stringstream mors(morse_code);
>         string letter;
>  
>         while (mors >> letter) {
>             vector<string>::iterator it;
>             it = find(Morse.begin(), Morse.end(), letter);
>             size_t dist = distance(Morse.begin(), it);
>             cout << Letter[dist] << endl;
>         }
>  
[/code]

ソースコードだけ提示して何も説明が無いためか、downvoteされていますが、この辺の記事でstringstreamからの入力は空白で区切られて通知されるとあります。  
[文字列を区切り文字で分割する
(istringstream)](https://maku77.github.io/cpp/string/split.html)  
[【C++入門】stringstreamで文字列を操作する方法](https://www.sejuku.net/blog/51234)  
[stringstreamを使ってみたんだよ](https://chakku.hatenablog.com/entry/2016/02/15/155106)

質問のソースコード該当部分は以下のようになるでしょう。  
モールス信号かどうか判定している各`if`も色々と工夫した方が良いですが、今は置いておきます。

[code]

    #include <sstream>
    // ... 途中省略 ...
        cout << "暗号を入力してください\n";
        getline(cin, morce);
    
        stringstream ss(morce);
        string token;
    
        while (ss >> token) {
            if (token == "・－")
            {
                alpha += 'a';
            }
            if (token == "－・・・")
            {
                alpha += 'b';
            }
            // ... 途中省略 ...
        }
        cout << alpha << endl;//すべて入力し終わったとき出力
    
[/code]


CC BY-SA 4.0
2021-01-31T07:47:29.430
73716
2021-01-31T07:47:29.430
26370
73710
answer