2016-04-18 19 views
5

ho stringa come questa: '123plus43times7'String Flusso in C++ per analizzare la stringa di parole e numeri

dove i numeri sono seguiti da parole da un dizionario.

ho capito che posso estrarre int/numeri utilizzando l'operatore >>:

StringStream >> number 

posso ottenere il numero. Tuttavia, il flusso ha ancora il numero in esso. Come rimuovo il numero quando la lunghezza del numero è sconosciuta o dovrei scoprire la lunghezza del numero e quindi usare str.substr() per creare un nuovo Stream String? Qualsiasi altro metodo migliore per farlo usando C++ STL String e SStream sarebbe molto apprezzato.

+1

Sembrerebbe molto più semplice da leggere solo l'intera stringa in un std :: string e quindi scorrere i caratteri per separarli in blocchi di cifre consecutive e blocchi di lettere. Quando hai i blocchi separati, puoi convertire le sequenze di cifre in interi tramite 'std :: atoi()'. –

+0

@ DanMašek è corretto. Una volta ottenuto un numero, prendi una 'stringa' e una' >> 'in una' stringa' si fermerà solo su spazi bianchi. Afferrerà le tue lettere, i tuoi numeri e tutto il resto. – user4581301

risposta

3

È possibile inserire uno spazio vuoto tra il testo e numeri e quindi utilizzare 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

Cosa fa 'while (ss >> s)'? Sembra sovrascrivere la stringa originale 's'. Significa che 'ss' conserva una copia di (l'originale)' s'? –

+0

Questo sovrascriverà 's' ogni volta. 'ss' è simile a un flusso di file, il suo contenuto non cambia, ma passa alla successiva posizione del file dopo ogni operazione. Vedi il risultato qui: https://ideone.com/qvJvMV –

2

Ecco un modo per farlo

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; 
    }