PDA

Visualizza la versione completa : estrarre sottostringhe in C++: come si fa?


Odimesh
14-12-2004, 17:09
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... :dhò:

Potete aiutarmi per almeno una di queste due richieste?
Grazie in anticipo a tutti gli amici di HTML.IT!!!!!!!!

netarrow
14-12-2004, 17:28
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:



#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).

:ciauz:

netarrow
14-12-2004, 17:45
per aspettare potresti fare una funzione tipo questa:



#include <time.h>

void aspetta(long m)
{
time_t adesso = time(NULL);
while(difftime(time(NULL), adesso) < m);

return
}


:ciauz:

netarrow
14-12-2004, 17:58
ecco un codice che riassume il tutto, stampa una stringa carattere per carattere aspettando 1 secondo:



#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 :fagiano: ), per dubbi chiedi.

:ciauz:

Odimesh
16-12-2004, 16:48
Originariamente inviato da netarrow
ecco un codice che riassume il tutto, stampa una stringa carattere per carattere aspettando 1 secondo:



#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 :fagiano: ), per dubbi chiedi.

:ciauz:

:yuppi: 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:


#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... :zizi:

Ciao e a presto! :ciauz:

Odimesh
25-02-2005, 14:13
Non ricevendo più risposte da parte di netarrow, ho pensato di rilanciare la mia questione sulle sottostringhe... :oVVoVe:
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! :bhò:
Qualcuno può aiutarmi? Ve ne sarò molto grato!

netarrow
25-02-2005, 14:28
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):



...
#include <string>
#include <iostream>
//altri include
using namespace std;
...


:ciauz:

netarrow
25-02-2005, 14:50
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:



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


:ciauz:

Loading