Uscira da un ciclo quando si usano i token

di Anonimizzato15270 il
10 risposte
In esempio questo codice

// strings and c-strings
#include <iostream>
#include <cstring>
#include <string>

int main ()
{
  std::string str ("Please split this sentence into tokens");

  char * cstr = new char [str.length()+1];
  std::strcpy (cstr, str.c_str());

  // cstr now contains a c-string copy of str

  char * p = std::strtok (cstr," ");
  while (p!=0)<<<<<<<
  {
    std::cout << p << '\n';
    p = std::strtok(NULL," ");
  }

  delete[] cstr;
  return 0;
}
Il ciclo while prosegue all'infinito.
Io vorrei legger i token contenuti nella stringa e poi uscire dal ciclo senza dovermi ingegnare qualcosa.
C'è la possibilità, un altro tipo di funzione magari?
Non sono riuscito a trovare nulla del genere oltre questa qui.
Grazie come sempre

10 Risposte

  • Mica si capisce il tuo problema.... Non ti puoi spiegare meglio?
  • Sto cercando un modo per uscire dal ciclo while.
    Quello che fa questo detto semplicemente è splittare la stringa,
    Ma resta bloccato all'infinito all'interno di un ciclo while.
    Io sto cercando un modo semplice per uscire dal ciclo quando lo split è terminato.
    Una qualche funzione di libreria magari, che permette di uscire dal ciclo quando finisce di splittare la stringa
    Nella situazione attuale non esce dal ciclo quindi mi vedo costretto ad ingegnarmi qualcosa.

    O meglio ancora il copia è incolla di questo codice funziona
    Ma quando lo adatto al mio condice non esce più dal ciclio
    
    tabelle::analizzaStringa(string str)
    {
    
        char * cstr= new char[str.length()+1];
        strcpy(cstr,str.c_str());
    
        char * p = strtok (cstr," ");
        while(cstr!=0)
            {
                cout << p << '\n';
                p=strtok(NULL," ");
            }
    
    }
    
  • Quindi non devi cercare come uscire ma capire cosa succede quando lo "adatti".
    Dato che sbagli qualcosa sicuramente, facci vedere questo codice "adattato" che genera un ciclo infinito e discutiamo di quello !

    P.S. Questa

    while(cstr!=0)

    è sbagliata perché dovrebbe essere

    while(p!=0)
  • ...e per forza che non esce mai dal ciclo! continui a verificare che cstr!=0, mentre dovresti verificare che p!=0, perché cstr non cambia mai e, non essendo 0 già in partenza, non diventa mai 0.
  • Errore mio il ciclo
    while(p!=0)
    
    tabelle::analizzaStringa(string str)
    {
    
        char * cstr= new char[str.length()+1];
        strcpy(cstr,str.c_str());
    
        char * p = strtok (cstr," ");
        while(p!=0)
            {
                cout << p << '\n';
                p=strtok(NULL," ");
            }
    
    
    Adesso però sorge un altro problema...
    se la stringa contiene ad esempio:"Marco(molto spazio bianco)Rossi";
    non la splitta per il troppo spazio tra le due "parole",,,
    come potrei ovviare?

    Forse meglio la vecchia sscanf?
    Mi ricordo che era tutto molto più semplice
  • Ok risolto cosi
    
    tabelle::analizzaStringa(string str)
    {
    
        char * cstr= new char[str.length()+1];
        strcpy(cstr,str.c_str());
    
        char * p = strtok (cstr," \t");
        while(p!=0)
            {
                cout << p << '\n';
                p=strtok(NULL,"  \t");
            }
    }
    
  • Alexxandro ha scritto:


    Ok risolto cosi
    Cioè come ti è stato suggerito ...

    Ma dovevi capirlo da solo ... bastava confrontare il codice iniziale con questo !

    E fra l'altro manca la delete !
  • Non ho copiato il codice completo...
    Hai ragione...
    ho fatto confusione...ero da un bel pò bloccato li...
    non ci ho visto proprio..sorry
  • Guarda che la delete è importante
  • Si lo so Oregon..
    Nel mio codice in codblock è scritta...
    Non ho molta confidenza con c++
    Elimina il puntatore alla classe...ma è un vettore di classi?
    
    // strings and c-strings
    #include <iostream>
    #include <cstring>
    #include <string>
    
    int main ()
    {
      std::string str ("Please split this sentence into tokens");
    
      char * cstr = new char [str.length()+1];
      std::strcpy (cstr, str.c_str());
    
      // cstr now contains a c-string copy of str
    
      char * p = std::strtok (cstr," ");
      while (p!=0)<<<<<<<
      {
        std::cout << p << '\n';
        p = std::strtok(NULL," ");
      }
    
      delete[] cstr;
      return 0;
    
Devi accedere o registrarti per scrivere nel forum
10 risposte