lunedì 19 novembre 2012

string

Ricevo da uno di voi per email:


Buon pomeriggio professore, volevo chiederle una cosa riguardo le stringhe in c++
volevo scrivere un programma ke legge una stringa, e stampa per 5 volte una parola dopo un certo posto
Esempio:
Ho la stringa "Mondo ciao"
Il programma mi ritornerà la scritta: "ciaociaociaociaociao"
come posso cancellare la parte"Mondo " oppure ignorare questa parte e stampare così "ciao" per 5 volte?
Grazie in anticipo

Essenzialmente mi chiede come estrarre una sottostringa. Io ho suggerito di usare find per trovare gli estremi della stringa da estrarre e substr per estrarre la sottostringa.
Se avete altri suggerimenti o una soluzione efficace postatela liberamente.

4 commenti:

  1. Se deve estrarre e ripetere una parola da una stringa ho pensato di fare questa funzione getword che estrae la parola numero n dalla stringa s, considerando le parole come sequenze di caratteri separate da spazi. La funzione trim l'ho scritta per eliminare spazi multipli e spazi a contorno. E' migliorabile, ma è un inizio.

    /*Estrazione e ripetizione parola*/

    #include
    #include
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    using std::getline;

    void trim(string&);
    string getword(string,int);

    int main(){
    string s,word;
    int n,rip;
    cout<<"Inserisci la frase: ";
    getline(cin,s);
    cout<<"Inserisci il numero della parola che vuoi ripetere: ";
    cin>>n;
    cout<<"Inserisci quante volte ripetere la parola: ";
    cin>>rip;
    word=getword(s,n);
    for(int i=0;i<rip;++i)cout<<word;
    }

    string getword(string s,int n){
    int i=0;
    size_t x=0,pos=0;
    size_t len[2]={0,s.npos};
    string temp;
    trim(s);
    if(n<=0)return temp;
    while(i<n && pos<s.length() && pos!=s.npos){
    pos=s.find_first_of(' ',x);
    len[0]=x;
    len[1]=pos-x;
    x=pos+1;
    ++i;
    }
    if(i<n-1)return s;
    return s.substr(len[0],len[1]);
    }

    void trim(string& s){
    for(size_t i=0;i<s.length();++i){
    size_t pos=s.find_first_of(' ',i);
    if(pos!=s.npos){
    if(pos==0 || pos==s.length()-1){
    s.erase(pos,1);
    --i;
    }
    else{
    size_t j=i;
    while(i+1<s.length() && s[i+1]==' '){
    ++i;
    }
    if(i-j){
    s.erase(j+1,i-j-1);
    i-=i-j;
    }
    }
    }
    }
    }

    RispondiElimina
  2. Probabilmente si potrebbe snellire un po' il codice ma in linea di massima va gia' bene cosi'.

    RispondiElimina
  3. non so se su un post così vecchio venga notato il commento, ma in generale, sulle stringhe è contemplato l'uso di espressioni regolari?

    RispondiElimina
  4. Dalla versione C++11 le regular expression sono parte della libreria standard. Per dettagli vedi ad esempio: http://www.cplusplus.com/reference/regex/

    RispondiElimina