Πώς μπορώ να επαναλάβω τις λέξεις μιας συμβολοσειράς;

Προσπαθώ να επαναλάβω τις λέξεις μιας συμβολοσειράς.

Η συμβολοσειρά μπορεί να θεωρηθεί ότι αποτελείται από λέξεις που χωρίζονται από κενά.

Σημειώστε ότι δεν ενδιαφέρομαι για τις συναρτήσεις συμβολοσειρών της C ή αυτού του είδους τον χειρισμό/πρόσβαση χαρακτήρων. Επίσης, παρακαλώ δώστε προτεραιότητα στην κομψότητα έναντι της αποτελεσματικότητας στην απάντησή σας.

Η καλύτερη λύση που έχω αυτή τη στιγμή είναι η εξής:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string s = "Somewhere down the road";
    istringstream iss(s);

    do
    {
        string subs;
        iss >> subs;
        cout << "Substring: " << subs << endl;
    } while (iss);
}

Υπάρχει ένας πιο κομψός τρόπος για να το κάνω αυτό;

Αυτός είναι ο αγαπημένος μου τρόπος για την επανάληψη σε μια συμβολοσειρά. Μπορείτε να κάνετε ό,τι θέλετε ανά λέξη.

string line = "a line of text to iterate through";
string word;

istringstream iss(line, istringstream::in);

while( iss >> word )     
{
    // Do something on `word` here...
}
Σχόλια (3)

Η STL δεν διαθέτει ήδη μια τέτοια μέθοδο.

Ωστόσο, μπορείτε είτε να χρησιμοποιήσετε τη συνάρτηση [strtok()][1] της C χρησιμοποιώντας το μέλος [std::string::c_str()][2], είτε να γράψετε τη δική σας. Εδώ είναι ένα δείγμα κώδικα που βρήκα μετά από μια γρήγορη αναζήτηση στο Google ("STL string split"):

void Tokenize(const string& str,
              vector& tokens,
              const string& delimiters = " ")
{
    // Skip delimiters at beginning.
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    // Find first "non-delimiter".
    string::size_type pos     = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
        // Found a token, add it to the vector.
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        // Skip delimiters.  Note the "not_of"
        lastPos = str.find_first_not_of(delimiters, pos);
        // Find next "non-delimiter"
        pos = str.find_first_of(delimiters, lastPos);
    }
}

Λαμβάνεται από το:

Σχόλια (10)

Η χρήση του std::stringstream, όπως το έχετε κάνει, λειτουργεί τέλεια και κάνει ακριβώς αυτό που θέλατε. Αν όμως ψάχνετε για διαφορετικό τρόπο να κάνετε τα πράγματα, μπορείτε να χρησιμοποιήσετε [std::find()][1]/[std::find_first_of()][2] και [std::string::substr()][3].

Ακολουθεί ένα παράδειγμα:


#include 
#include 

int main()
{
    std::string s("Somewhere down the road");
    std::string::size_type prev_pos = 0, pos = 0;

    while( (pos = s.find(' ', pos)) != std::string::npos )
    {
        std::string substring( s.substr(prev_pos, pos-prev_pos) );

        std::cout 
Σχόλια (1)