2016-04-18 4 views
5

I Zeichenfolge wie diese: '123plus43times7'String-Stream in C++ Folge von Worten zu analysieren und Nummern

wo Zahlen durch Worte aus einem Wörterbuch folgt.

Ich verstehe, dass ich kann unter Verwendung des >> Operator int/Zahlen extrahieren:

StringStream >> number 

ich die Nummer bekommen. Der Stream enthält jedoch immer noch die Nummer. Wie entferne ich die Nummer, wenn die Länge der Nummer unbekannt ist, oder soll ich die Länge der Zahl herausfinden und dann strstr() verwenden, um einen neuen String Stream zu erstellen? Jede andere bessere Methode, um es mit C++ STL String und SStream tun würde wirklich geschätzt.

+1

Es wäre viel einfacher scheinen nur die gesamte Zeichenfolge in eine lesen std :: string und iterieren dann über die Zeichen, um sie in Blöcke von aufeinanderfolgenden Ziffern und Buchstabenblöcken zu trennen. Wenn Sie die Blöcke getrennt haben, können Sie die Ziffernfolgen mit 'std :: atoi()' in Ganzzahlen umwandeln. –

+0

@ DanMašek hat Recht. Sobald Sie eine Zahl erhalten haben, greifen Sie eine 'Zeichenkette' und ein' >> 'zu einer' Zeichenkette' wird nur auf Leerstellen enden. Es wird Ihre Briefe, Ihre Zahlen und alles andere, was sich in den Weg stellt, ergreifen. – user4581301

Antwort

3

können Sie Leerzeichen zwischen Text einfügen und Zahlen und verwenden dann std::stringstream

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

int main() 
{ 
    std::string s = "123plus43times7"; 
    for (size_t i = 0; i < (s.size() -1); i++) 
    { 
     if (std::isalpha(s[i]) != std::isalpha(s[i + 1])) 
     { 
      i++; 
      s.insert(i, " "); 
     } 
    } 
    std::stringstream ss(s); 
    while (ss >> s) 
     std::cout << s << "\n"; 
    return 0; 
} 
+0

Was macht 'while (ss >> s)'? Es scheint die ursprüngliche Zeichenfolge 's' zu überschreiben. Bedeutet das, dass "ss" eine Kopie von (dem Original) 's' behält? –

+0

Dies überschreibt jedes Mal 's'. 'ss' ist einem Dateistream ähnlich, sein Inhalt ändert sich nicht, aber nach jeder Operation springt er zur nächsten Dateiposition. Sehen Sie das Ergebnis hier: https://ideone.com/qvJvMV –

2

hier ein Weg, es zu tun

string as = "123plus43times7"; 

    for (int i = 0; i < as.length(); ++i) 
    { 
     if (isalpha(as[i])) 
      as[i] = ' '; 
    } 

    stringstream ss(as); 
    int anum; 

    while (ss >> anum) 
    { 
     cout << "\n" << anum; 
    } 
Verwandte Themen