wake-up-neo.net

Zeichenfolge in einzelne Leerzeichen aufteilen

Mögliches Duplizieren:
Wie teile ich einen String in C++ auf?

Ich muss einen String in einzelne Leerzeichen aufteilen und in einem Array von Strings speichern. Ich kann dies mit einem istringstream erreichen, aber was ich nicht erreichen kann, ist folgendes:

Ich möchte, dass jeder Platz das aktuelle Wort beendet. Wenn also zwei Leerzeichen nacheinander vorhanden sind, sollte ein Element meines Arrays leer sein.

Zum Beispiel:

(Unterstrich steht für Leerzeichen)

This_is_a_string.
gets split into:
A[0] = This
A[1] = is
A[2] = a
A[3] = string.

This__is_a_string.
gets split into:
A[0] = This
A[1] = ""
A[2] = is
A[3] = a
A[4] = string.

Wie kann ich das umsetzen?

31
xbonez

Sie können sogar Ihre eigene Split-Funktion entwickeln (ich weiß, etwas altmodisch):

size_t split(const std::string &txt, std::vector<std::string> &strs, char ch)
{
    size_t pos = txt.find( ch );
    size_t initialPos = 0;
    strs.clear();

    // Decompose statement
    while( pos != std::string::npos ) {
        strs.Push_back( txt.substr( initialPos, pos - initialPos ) );
        initialPos = pos + 1;

        pos = txt.find( ch, initialPos );
    }

    // Add the last one
    strs.Push_back( txt.substr( initialPos, std::min( pos, txt.size() ) - initialPos + 1 ) );

    return strs.size();
}

Dann müssen Sie es nur mit einem Vektor <string> als Argument aufrufen:

int main()
{
    std::vector<std::string> v;

    split( "This  is a  test", v, ' ' );
    dump( cout, v );

    return 0;
}

Suchen Sie den Code zum Teilen einer Zeichenfolge in IDEone .

Hoffe das hilft.

25
Baltasarq

Wenn nur ein Leerzeichen das Trennzeichen ist, ist wahrscheinlich der std::getline
Zum Beispiel:

int main() {
  using namespace std;
  istringstream iss("This  is a string");
  string s;
  while ( getline( iss, s, ' ' ) ) {
    printf( "`%s'\n", s.c_str() );
  }
}
26
Ise Wisteria

Kannst du boost verwenden?

samm$ cat split.cc
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

#include <boost/foreach.hpp>

#include <iostream>
#include <string>
#include <vector>

int
main()
{
    std::string split_me( "hello world  how are   you" );

    typedef std::vector<std::string> Tokens;
    Tokens tokens;
    boost::split( tokens, split_me, boost::is_any_of(" ") );

    std::cout << tokens.size() << " tokens" << std::endl;
    BOOST_FOREACH( const std::string& i, tokens ) {
        std::cout << "'" << i << "'" << std::endl;
    }
}

beispielausführung:

samm$ ./a.out
8 tokens
'hello'
'world'
''
'how'
'are'
''
''
'you'
samm$ 
4
Sam Miller

Wenn Sie sich gegen Boost weigern, können Sie den normalen alten operator>> zusammen mit std::noskipws verwenden:

BEARBEITEN: Updates nach dem Testen.

#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
#include <sstream>

void split(const std::string& str, std::vector<std::string>& v) {
  std::stringstream ss(str);
  ss >> std::noskipws;
  std::string field;
  char ws_delim;
  while(1) {
    if( ss >> field )
      v.Push_back(field);
    else if (ss.eof())
      break;
    else
      v.Push_back(std::string());
    ss.clear();
    ss >> ws_delim;
  }
}

int main() {
  std::vector<std::string> v;
  split("hello world  how are   you", v);
  std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "-"));
  std::cout << "\n";
}

http://ideone.com/62McC

3
Robᵩ

Wenn Sie Boost nicht abgeneigt sind, ist der boost.tokenizer flexibel genug, um dieses Problem zu lösen

#include <string>
#include <iostream>
#include <boost/tokenizer.hpp>

void split_and_show(const std::string s)
{
    boost::char_separator<char> sep(" ", "", boost::keep_empty_tokens);
    boost::tokenizer<boost::char_separator<char> > tok(s, sep);
    for(auto i = tok.begin(); i!=tok.end(); ++i)
            std::cout << '"' << *i << "\"\n";
}
int main()
{
    split_and_show("This is a string");
    split_and_show("This  is a string");

}

test: https://ideone.com/mN2sR

2
Cubbi

Sie können auch einfach die alte Mode "strtok" verwenden

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

Es ist ein bisschen wackelig, beinhaltet aber keinen Boost (nicht der Boost ist eine schlechte Sache).

Sie rufen im Wesentlichen strtok mit der Zeichenfolge auf, die Sie teilen möchten, und dem Trennzeichen (in diesem Fall ein Leerzeichen), und Sie erhalten ein Zeichen *. 

Über den Link:

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}
2
TurqMage

Sie könnten die einfache Funktion strtok () (*) von hier verwenden. Beachten Sie, dass Token für Trennzeichen erstellt werden

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This is a string";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}
0
user349026