Newsgroup: it.comp.lang.c++
Titolo: Prima stringa, poi... boh!

Premetto la mia newbieaggine,
ma ero interessato a capire perchč accade questa cosa:
Il codice sotto effettua l'ordinamento di una stringa...
funziona, solo che nn capisco perchč dopo l'ordinamento
il compilatore nn mi tratta piů la stringa come una stringa...
infatti se prima scrive la stringa con un semplice
cout << stringa;
poi dopo aver chiamato la funzione devo per forza usare un ciclo for,
altrimenti con "cout << stringa;" non mi da in output nulla...
Per indagare ho applicato la funzione strlen() alla stringa prima e dopo
l'ordinamento, e ho notato che dopo l'ordinamento strlen restituisce come
valore 0!!
PERCHE?!?!?!?!?
Spero che qlc sappia darmi una spiegazione esauriente perchč sono molto
confuso a riguardo!!
Grazie mille in anticipo....
Aleander
<< --- Inizio codice C++ --- >>
// Ordinamento bubbleSort
#include <iostream>
#include <stdlib.h>
using namespace std;
void swap(char &primo, char &secondo);
void swap(int &primo, int &secondo);
template <class T>
void bubbleSortCres(T array, const int size);
template <class R>
void bubbleSortDecr(R array, const int size);
int main(){
    const int arraySize = 27;
    char array[arraySize] = "POIUYTREWQASDFGHJKLMNBVCXZ";
    cout << "Stringa prima dell'ordinamento: ";
    cout << array;
    cout << endl << "Lunghezza stringa: " << strlen(array) << endl;
    bubbleSortCres(array, arraySize);
    cout << "Stringa dopo l'ordinamento crescente: ";
    for (int i=0; i<arraySize; i++)
       cout << array[i];
    cout << endl
         << "Lunghezza stringa: " << strlen(array) << endl;
    cout << array;  //questo nn scrive nulla!!
system("PAUSE");
return 0;
}
void swap(char &primo, char &secondo){
    char temp;
    temp = primo;
    primo = secondo;
    secondo = temp;
}
void swap(int &primo, int &secondo){
    int temp;
    temp = primo;
    primo = secondo;
    secondo = temp;
}
template <class T>
void bubbleSortCres(T array, const int size){
    for (int j=0; j<size-1; j++)
       for (int i=0; i<size-1; i++)
          if (array[i]>array[i+1])
             swap(array[i],array[i+1]);
}
template <class R>
void bubbleSortDecr(R array, const int size){
    for (int j=0; j<size-1; j++)
       for (int i=0; i<size-1; i++)
          if (array[i]<array[i+1])
             swap(array[i],array[i+1]);
}

 [CUT]
A occhio dalla tua descrizione, senza dare niente piu' che un'occhiata 
iniziale al codice (ci sono un po' di punti, tra l'altro, in cui si 
potrebbero scrivere le cose molto meglio, magari se ho tempo dopo ti 
butto giu' due note): non e' che ordini anche il '\0' finale, il quale 
quindi viene portato all'inizio dalla bubble sort? Questo spiegherebbe 
perche' la stringa viene rilevata di lunghezza zero e non venga 
stampata, e che pero', se cicli manualmente, funzioni (il '\0' non 
stampa nulla, e tutti i caratteri dopo mandano in output qualcosa).
-- 
Mat/tia Belletti - Graduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

 
 bubbleSortCres(array, arraySize - 1 );

 quindi viene portato all'inizio dalla bubble sort?
Sì, facevo questa pollata qua... quindi deduco che una stringa è
riconosciuta come tale finche c'è un '\0' alla fine...
Nel caso di una stringa definita con un puntatore tipo char *stringa =
"ciao", invece come stanno le cose?
E si potrebbe sostituire una stringa così definita nel mio codice, magari
con uno strlen() per determinarne la lunghezza da passare alla funzione
bubbleSort?
[lo dico perchè un mio flebile tentativo è fallito, :,(  ]
Le stringhe sono un argomento che sta attentando il mio cervello
ultimamente...
mille grazie per l'aiuto...
Alender


giustamente...

 ultimamente...
No, non dare la colpa alle stringhe se ti vuoi fare del male con gli
array e i puntatori.
Per ordinare i caratteri di una stringa:
  string str("una stringa");
  sort(str.begin(), str.end());
Il c++ e` abbastanza complicato, se poi ti metti a complicare anche le
cose semplici ...
        Mauro