Sottostringhe in C++

di il
13 risposte

Sottostringhe in C++

Ciao a tutti! Devo scrivere un programma che analizza una stringa di testo e riscrive, una su ogni riga, le parti di testo comprese tra < e >. Ho scritto questo

#include <iostream>
#include <stdlib.h>
#include <string>
#include <string.h>
using namespace std;

int main () {
    cout<<"Questo programma analizza un testo e stampa le parti comprese tra < e >"<<endl;
    cout<<"Inserire il testo: ";
    string text ; getline (cin , text);
    int i , j , k;
    for (i = 0 ; i < text.size() ; ++i) {
        for (j = 0 ; j < text.size() ; ++j) {
            if (text[i] == char(60) && text[j] == char(62)) {
                for (k = i+1 ; k < j ; ++k ) {
                    cout<<text[k];
                }
            }
        }
    }
    cout<<endl;
    system("PAUSE");
    return 0;
}
e funziona se < e > compaiono una sola volta (ad es. il <libro> è sul tavolo). Se però scrivo il <libro> è sul <tavolo> il programma non capisce la corretta sequenza e scrive librolibro> è sul <tavolotavolo.
Cosa devo correggere?
Grazie a tutti

13 Risposte

  • Re: Sottostringhe in C++

    Prima di tutto devi togliere #include <string.h>. #incude <string> basta e avanza.
    Visto che hai la classe string tutto si risolve con:
    1. Trova l'indice dove compare il primo '<'. chiamiamolo i
    2. Trova l'indice dove compare il primo '>'. chimiamolo j
    3. string sub1 = text.substr(i,j-1);
    4. text = text.substr(j);
    e così via fino alla fine della riga.
    
    size_t i,j;
    	string sub;
    	string text = "testo di <prova> con <tante> parole dentro le <parentesi>";
    	while((i = text.find_first_of('<')) != string::npos)
    	{
    		j = text.find_first_of('>');
    		if(j != string::npos)
    			sub = text.substr(i+1,j-i-1);
    		else
    			sub = text.substr(i+1);
    		std::cout << sub << endl;
    		text = text.substr(j+1);
    	}
    
    Nessun comparazione o altro. Molto + efficente e usa le funzioni contenute nella classe string.
  • Re: Sottostringhe in C++

    Capisco...ma c'è un modo di scriverlo modificando quello che avevo scritto? Vorrei solo che leggesse i caratteri < e > in sequenza in modo da iniziare con < e interrompere la lettura al primo >.
  • Re: Sottostringhe in C++

    Certo. Ci sono mille modi per sriverlo ma perche inventare l'acqua calda quando le funzioni li hai sotto il naso. Ad ogni modo: trovatola prima sequenza devi troncare la riga un carattere dopo la prima >. Poi continua a rifare lo stesso procedimento fino alla fine della riga. Io con l'esempio sopra faccio così.
  • Re: Sottostringhe in C++

    Grazie mille! Sei stato molto chiaro.
    Ciao a tutti.
  • Re: Sottostringhe in C++

    Un'ultima cosa: il programma ovviamente funziona bene ma se per esempio scrivo " il libro è < sul tavolo " e non metto il carattere > entra in loop e continua a scrivere "sul tavolo". E' normale?
  • Re: Sottostringhe in C++

    Modificalo così
    
    size_t i,j;
       string sub;
       string text = "testo di <prova> con <tante> parole dentro le <parentesi>";
       while((i = text.find_first_of('<')) != string::npos)
       {
          j = text.find_first_of('>');
          if(j != string::npos)
             sub = text.substr(i+1,j-i-1);
          else
             sub = text.substr(i+1);
          std::cout << sub << endl;
          if(j == string::npos)
                 break;
          else 
                text = text.substr(j+1);  
       }
    
  • Re: Sottostringhe in C++

    Adesso non va più in loop ma se ad esempio scrivo "il <libro è sul tavolo" mi stampa "libro è sul tavolo" una sola volta. Ma non dovrebbe saltare del tutto la stampa, visto che non c'è il carattere >?
  • Re: Sottostringhe in C++

    Allora spiegati meglio. Se vuoi che stampi solo se trova la copia il problema è + semplice
    
    size_t i,j;
       string sub;
       string text = "testo di <prova> con <tante> parole dentro le <parentesi>";
       while((i = text.find_first_of('<')) != string::npos)
       {
          j = text.find_first_of('>');
          if(j != string::npos)
            {
                sub = text.substr(i+1,j-i-1);
                std::cout << sub << endl;
                 text = text.substr(j+1); 
            }
          else
             break;
       }
    
  • Re: Sottostringhe in C++

    Adesso è veramente perfetto! grazie mille per la tua disponibilità e chiarezza!
    volevo solo chiederti: string::npos significa l'ultimo carattere della stringa?
  • Re: Sottostringhe in C++

    Significa posizione non valida.
  • Re: Sottostringhe in C++

    Ah...e quand'è che una posizione all'interno di una stringa può essere non valida?
  • Re: Sottostringhe in C++

    Qunado la ricerca non ha prodotto risultati mette il valore npos per dire che non ha trovato niente.
    find_first_of scandisce tutta la stringa e siccome passa oltre va a finire in posizione non valida.
  • Re: Sottostringhe in C++

    Ora è tutto chiaro. Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
13 risposte