1

重複の可能性:
C++ での文字列の分割

私は C++ クラスの課題に取り組んでおり、助けが得られることを望んでいました。C++ でコーディングする際の最大の問題の 1 つは、文字列の解析です。文字列を解析するためのより複雑な方法を見つけましたが、文字列を 2 つのセクション (コマンドとデータ セクション) に解析するだけでよい非常に単純なプログラムを作成する必要があります。例: Insert 25Insert と 25 に分割されます。

文字列を2つのセクションにのみ分割することがわかっているので、文字列の配列を使用してデータを保存することを計画していました。ただし、次のような解析を必要としない文字列を読み取ることができる必要もあります。Quit

ブーストなどの外部ライブラリを使用せずにこれを達成する最も簡単な方法は何ですか?

4

4 に答える 4

2

最も単純なものは次のようになります。

string s;
int i;

cin >> s;
if (s == "Insert")
{
    cin >> i;
    ... // do stuff
}
else if (s == "Quit")
{
    exit(0);
}
else
{
    cout << "No good\n";
}

たとえば、ユーザーエラーの適切な処理、拡張性などが必要な場合、最も単純な方法はあまり良くないかもしれません.

于 2012-10-21T20:11:46.647 に答える
1

を使用してストリームから文字列を読み取ってから、文字列内のgetlineスペース文字の最初の位置を見つけ、関数を 2 回使用することで分割することができます (スペースの左側のコマンドと右側のデータ)。スペース)。' 'substr

while (cin) {
     string line;
     getline(cin, line);
     size_t pos = line.find(' ');
     string cmd, data;
     if (pos != string::npos) {
         cmd = line.substr(0, pos-1);
         data = line.substr(pos+1);
     } else {
         cmd = line;
     }
     cerr << "'" << cmd << "' - '" << data << "'" << endl;
}

これはideone のデモへのリンクです

于 2012-10-21T20:15:00.573 に答える
1

これは別の方法です:

string s("Insert 25");
istringstream iss(s);
do
{
   string command; int value;
   iss >> command >> value;
   cout << "Values: " << command << " " << values << endl;
} while (iss);
于 2012-10-21T20:15:25.560 に答える
0

私はそのようなことにストリームを使用するのが好きです。

int main()
{
    int Value;
    std::string Identifier;
    std::stringstream ss;
    std::multimap<std::string, int> MyCollection; 

    ss << "Value 25\nValue 23\nValue 19";

    while(ss.good())
    {
            ss >> Identifier;
            ss >> Value;
            MyCollection.insert(std::pair<std::string, int>(Identifier, Value));
    }

    for(std::multimap<std::string, int>::iterator it = MyCollection.begin(); it != MyCollection.end(); it++)
    {
            std::cout << it->first << std::endl;
            std::cout << it->second << std::endl;
    }

    std::cin.get();
    return 0;
}

このようにして、データを必要な形式に変換することができます。また、ストリームは空白で自動的に分割されます。ファイルを操作する場合、 std::fstream と同じように機能します。

于 2012-10-21T20:58:19.927 に答える