Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    estrarre sottostringhe in C++: come si fa?

    Salve a tutti, vorrei chiedervi una "piccolissima" (credo...) informazione riguardo al metodo più valido da utilizzare per estrarre sottostringhe in C++! Per l'esattezza, quello che vorrei fare consisterebbe in una apparente sciocchezza: ebbene, per estrarre e successivamente visualizzare su schermo le ultime tre o quattro lettere di una generica stringa... come potrei fare? :master:
    So che dovrebbe esistere una funzione in C++ adatta allo scopo, solo che purtroppo non ho alba di quale sia...

    Un'ultima cosetta... mi sono sempre interessato ai "ritardi" nei programmi, o meglio, a stampare su schermo stringhe diverse, e nella stampa tra l'una e l'altra, creare una specie di "ritardo forzato"...
    Ci sono riuscito dopo qualche tentativo con stringhe INTERE, ma ciò che mi interessa veramente consiste nella stampa a video di caratteri singoli... qualcosa di simile al "delay", credo, solo che in C++ questa funzione purtroppo non c'è, e per l'utilizzo dello "sleep" mi hanno detto che è necessaria la programmazione sotto Linux...

    Potete aiutarmi per almeno una di queste due richieste?
    Grazie in anticipo a tutti gli amici di HTML.IT!!!!!!!!
    Il mio sogno è CREARE..............
    ma CREARE può essere molto più difficile di quello che pensi......

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    per le sottostringhe, dato che parli di C++ penso tu stia usando la OOP quindi la classe string e non i puntatori a carattere.

    Quindi, c'è il metodo substr(int, int) se non ricordo male, u esempio è questo:

    codice:
    #include <string>
    #include <iostream>
    using namespace std;
    
    main() {
    string str("Ciao a tutti!");
    cout << str.substr(5, 9) << endl;
    // stampa i caratteri dal quinto al ottavo(parte da 0)
    }
    dovrebbe essere questa.

    Per il tempo, se devi rimanere nello standar, l'unica cosa che mi viene in mente è usare il file header time.h, (ctime è quello nuovo).

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    per aspettare potresti fare una funzione tipo questa:

    codice:
    #include <time.h> 
    
    void aspetta(long m) 
    { 
    time_t adesso = time(NULL); 
    while(difftime(time(NULL), adesso) < m);
    
    return
    }
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    ecco un codice che riassume il tutto, stampa una stringa carattere per carattere aspettando 1 secondo:

    codice:
    #include <ctime> //nuovo time.h
    #include <iostream> // nuovo I/O
    #include <string>// nuovo string.h che contiene la classe string
    
    using namespace std;
    // specifica che verrà usato il namespace detto std(standar)
    
    void aspetta(long m)// m = secondi da aspettare 
    { 
    time_t adesso = time(NULL); //prendi l'ora di adesso
    while(difftime(time(NULL), adesso) < m);
    //se non sono passati "m" secondi da "adesso", ripeti il while
    
    return;//sono passati quindi esce(return opzionale)
    }
    
    int main() {
    	string str("Testo di prova");//oggetto stringa
    	for(register int i = 0; i < str.size(); i++) {
    		cout << str[i];
    //[] è sovraccaricato quindi non è necessario usare substr
    		aspetta(1);//aspetta 1 secondo(molto circa)
    	}
    	cout << endl;
    //quando la stringa è stata stampata tutta vai a capo.
    
    	return 0;//terminato con successo
    }
    l'ho pure commentato(oggi nevicherà a trieste ), per dubbi chiedi.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    Originariamente inviato da netarrow
    ecco un codice che riassume il tutto, stampa una stringa carattere per carattere aspettando 1 secondo:

    codice:
    #include <ctime> //nuovo time.h
    #include <iostream> // nuovo I/O
    #include <string>// nuovo string.h che contiene la classe string
    
    using namespace std;
    // specifica che verrà usato il namespace detto std(standar)
    
    void aspetta(long m)// m = secondi da aspettare 
    { 
    time_t adesso = time(NULL); //prendi l'ora di adesso
    while(difftime(time(NULL), adesso) < m);
    //se non sono passati "m" secondi da "adesso", ripeti il while
    
    return;//sono passati quindi esce(return opzionale)
    }
    
    int main() {
    	string str("Testo di prova");//oggetto stringa
    	for(register int i = 0; i < str.size(); i++) {
    		cout << str[i];
    //[] è sovraccaricato quindi non è necessario usare substr
    		aspetta(1);//aspetta 1 secondo(molto circa)
    	}
    	cout << endl;
    //quando la stringa è stata stampata tutta vai a capo.
    
    	return 0;//terminato con successo
    }
    l'ho pure commentato(oggi nevicherà a trieste ), per dubbi chiedi.

    Ma... è semplicemente FANTASTICO!!!!! Davvero, non mi aspettavo così tante linee di codice, sei veramente grande!!!!
    E adesso posso anche spiegarti perché stavo chiedendo in giro queste cosette di C++: praticamente, è da qualche tempo che sto cercando di realizzare assieme ad un mio amico una specie di avventura grafica vecchio stile (hai presente quei titoli giocabili per il DOS, in cui si impartiva nient'altro che semplici comandi per effettuare le varie azioni del personaggio protagonista... ecco, la questione delle sottostringhe era saltata fuori quando mi è toccato di creare una funzione per il salvataggio del gioco, nel senso che una volta che l'utente impartiva al programma il comando necessario per poter salvare, avrebbe dovuto scegliere da sé il nome della partita da salvare (a condizione, però, che l'estensione del file contenente il salvataggio la decidessi io... e se l'utente decidesse di inserire una sua estensione per il file?).
    Potrò spiegarti meglio tramite queste righe di codice:

    codice:
    #include <fstream.h>
    #include <iostream.h>
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    char scelta[10], nome[20];
    do {
       cout<<"1). Salva partita\n";
       cout<<"2). Esci\n";
       gets(scelta);
       switch(scelta) {
          case 1: cout<<"Con quale nome vuoi salvare il file?\n";
                        gets(nome);
                        for (int i=0; i<strlen(nome);i++) {
                        if (nome[i]=='.') /* controlla se nel nome scelto è presente un punto per l'estensione */
                        {
                        cout<<"Il file da salvare presenta un'estensione diversa da quella predefinita. Continuare? (S/N)\n";
                        cin>>risp;
                        if (risp=='s')
                        salva(nome); // il parametro passa alla funzione
                        else
                        break;
                        }
                        else {
                        strcat(nome,".cst"); /* concatena la stringa priva di estensione all'estensione predefinita */
                        salva(nome);
                        } // chiude la condizione principale
                        } // chiude il ciclo for
                        } // chiude lo switch
       } while (scelta != 2) // chiude il do-while
    return 0; // il programma termina
    } // chiude il main
    Ecco, il mio scopo consisteva nell'estrarre gli ultimi quattro o cinque caratteri del nome scelto da tastiera, nel caso in cui l'utente decidesse di utilizzare una sua estensione, e poi di utilizzare un nuovo cout, proprio per informarlo che l'estensione da lui scelta era diversa da quella del programmatore... so che è un'idea un po' incasinata la mia, comunque spero di averti spiegato nel modo migliore possibile...

    Ciao e a presto!
    Il mio sogno è CREARE..............
    ma CREARE può essere molto più difficile di quello che pensi......

  6. #6
    Non ricevendo più risposte da parte di netarrow, ho pensato di rilanciare la mia questione sulle sottostringhe... VVoVe:
    Premetto stavolta fin da subito che utilizzo Turbo C++ e NON C-Builder, oppure Visual... per il momento, solo Turbo C++, purtroppo (visto che ho provato C-Builder a scuola, e mi ha dato subito una buona impressione, ma il cammino è ancora lungo!)...
    Difatti la funzione substr che molto gentilmente mi ha passato netarrow è indubvbiamente utilissima, ma per pura sfortuna in Turbo C++ non funziona, e non ho nemmeno idea se ci sia qualcosa del genere tra le svariate librerie dell'editor!
    Qualcuno può aiutarmi? Ve ne sarò molto grato!
    Il mio sogno è CREARE..............
    ma CREARE può essere molto più difficile di quello che pensi......

  7. #7
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    substr è ANSI, quindi funziona su tutti i compilatori, l'importante è che usi il namepsace std e l'oggetto string del header string(NON string.h ma string di std):

    codice:
    ...
    #include <string>
    #include <iostream>
    //altri include
    using namespace std;
    ...
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  8. #8
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    guarda, un esempio che fa quello che ti serve, viene passata una stringa, se ha il punto, quindi l'estensione, viene tolta e sostituita con quella di default, sennò solo aggiunta:

    codice:
    #include <string>//senza .h
     #include <iostream>//senza .h 
    using namespace std; 
    
    const string EXT = ".sav";
    
    void RegularExt(string& e) {
    	int pos = e.find(".", 0);
    	if(pos != -1) e.erase(pos, e.size()-1);
    	e.append(EXT);
    }
    
    int main() {
    string a = "ciao.abc";
    RegularExt(a);
    cout << a << endl;
    string b = "salvataggio";
    RegularExt(b);
    cout << b << endl;
    	return 0;
    }

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.