[C++] La classe basic_string: minitutorial

Introduzione

Nel mio progetto di tesi,faccio uso di stringhe di caratteri per l'invio di comandi e il confronto fra stringhe.
Venendo dal mondo Java,ho fatto un po' di fatica ad orientarmi su come vengono trattate le stringhe in C++ (con particolare considerazione all'ambiente Visual Studio).
A seguire alcune considerazioni sulla classe basic_string.

Sprazzi di codice

Quanto segue è la creazione di una stringa e il confronto fra stringhe, prendendo in input una stringa digitata dall'utente. Il confronto viene fatto sia tramite l'operatore "==" sia tramite compare che ritorna 0 se le stringhe sono uguali:

string myString("partenza");
string passwd;

cout << "Stringa: \"" << myString << "\"" << endl;
cout << "Lunghezza stringa: " << myString.length() << endl;

cout << "Scrivi una stringa: ";
getline(cin, passwd, '\n');
if(passwd == "partenza") {
cout << "Usato \"=\": OK" << endl;
}
if(passwd.compare(myString) == 0){
cout << "Usato \"compare\": OK" << endl;
}
Osserviamo ora il seguente confronto:
string newString("getttnversion\r\n");
string another("getttnversion");
cout << "Confronto fra stringhe con caratteri di escape: " << endl;
cout << " - ";
if(newString.compare(another) == 0)
cout << "Risultano uguali\n" << endl;
else cout << "Risultano diverse\n" << endl; // risulteranno diverse!
Le stringhe risultano diverse! Per ragioni di esigenza,quando passo una stringa di caratteri dal client in java,la faccio terminare con un "\n",pensando che recv interpreti la cosa come la fine del messaggio (anche se non ho ben capito su che basi recv determini che il client ha smesso di inoltrare dati...).
Segue quindi una funzione "purificatrice" per le stringhe: rimuovo gli spazi,i carriage return e i line feed:
void cleanString(string *aString) {
for(size_t i = aString->find(" ", 0); i != aString->npos; i = aString->find(" ", i)){
aString->erase(i,1);
}
for(size_t i = aString->find("\n", 0); i != aString->npos; i = aString->find("\n", i)){
aString->erase(i,1);
}
for(size_t i = aString->find("\r", 0); i != aString->npos; i = aString->find("\r", i)){
aString->erase(i,1);
}
}

// come si usa...
cleanString(&anotherString);
In questo modo anotherString verrà ripulita di spazi e dai caratteri '\r' e '\n'. Se qualcuno sa spiegarmi nel dettaglio:
  • come fa recv a determinare la fine dei dati spediti;
  • se aspetta all'infinito oppure scade dopo un timeout;
Mi farebbe un bel piacere :)

0 comments:

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger