Newsgroup: it.comp.lang.c++
Titolo: Aiuto su codice perfavore

Salve sto preparando un programma che riceve una stringa in ingresso di
caratteri, separati ognuno da una virgola (es:. (gpgg,1234.55,ecc,ecc))
quello che volevo sapere e come poter inserire in un vettore o array di
char, ogni sinparolin modo tale da poter accedere ad ognuna attraverso la
struttura output[i], io ho pensato ad un codice del genere ma non capisco
perchč non funzioni:
#include <string.h>
#include <iostream.h>
char main()
{
int screen;
int dimout=0;
int ls=10;
char *output;
char s[]="primo, secondo";
char *p;
p=strtok(s, ",");
while(p){
 p=strtok(NULL,",");
 dimout++;
 output=new char[dimout];
 char* st;
 st=new char[ls];
 strcpy(st,s);
 strcpy(output,st);
}
cout << "Tipo: " << output[0]<<"\n";
cin >>screen;
}
il risultato č il seguente:
Tipo: p
Vi sarei grato se mi aiutaste indicandomi gli errori nel codice oppure
dicendomi come fare grazie.

 dicendomi come fare grazie.
Ci sono una serie di errori sui puntatori. Ecco più o meno il tuo codice
modificato con i commenti nei punti "salienti":
#define MAX_LENGTH 25
#define MAX_WORDS 50
int main()  //char main()? non è standard!
{
int screen; //non ne ho capito l'utilizzo
int dimout=0;
int ls=10;
char **output; //output è in realtà una matrice poichè ogni output[i] punta
ad una stringa di caratteri (ossia a un char*)
char s[]="primo, secondo";
char *p;
p=strtok(s, ",");
output = new char*[MAX_WORDS]; //MAX_WORDS e MAX_LENGTH possono essere
determinate anche a run-time, ho messo i #define per semplicità
while(p){
 output[dimout]=new char[MAX_LENGTH];
 strcpy(output[dimout],p); //copia il valore nell'array di caratteri puntato
da output[dimout]
 dimout++; //incremento l'indice solo dop che output [0] è stato riempito!
 p=strtok(NULL,","); //questo è stato spostato alla fine per non saltare il
primo elemento
// char* st; Queste 4 righe commentate, non le ho capite, ma comunque non
servono
// st=new char[ls];
// strcpy(st,s);
// strcpy(output,st);
}
cout << "Tipo: " << output[0]<<"\n";
cin >>screen;
}
Ad ogni modo se vuoi avvicinarti al c++, sbagli approccio utilizzando
funzioni del C standard quali strcpy,strtok e così via.
Ti consiglio di guardarti bene l'utilizzo delle classi standard vector,
iostream e soprattutto string.

 dicendomi come fare grazie.
Sarebbe forse "meno peggio" se fosse riscritto cosě:
int screen;
int dimout=0;
char *output;
char s[]="primo, secondo";
char *p;
p=strtok(s, ",");
while(p)
{
          int ls=strlen(p);
          char* st=new char[ls+1];
          strcpy(st,p);
          // routine che memorizza st in una lista
          cout << st << endl; // io sono pigro e lo stampo e basta
          ++dimout;
          delete [] st;
          p=strtok(NULL,",");
}
Nota che io non ho scritto la routine che memorizza st in una lista o un
vettore di stringhe perché l'idea di usare il C (perché il tuo č un
programma in C) la trovo superata (anche riluttante, almeno in questo NG).
Se vuoi migliorare le cose, forse č meglio che passi al C++ e guardi
l'esempio che ti ho fatto, fermo restando che sicuramente esistono altri
modi e forse anche migliori, ti faccio notare che con il C++ non ho bisogno
d'impazzire per allocare memoria e gestirla: con i container STL il codice
non cambia se uso una std::list o un std::vector.
Per chi come me proveniva dal C, gli iteratori sembrano a prima vista delle
diavolerie per gente con serie turbe psichiche, ma seguendo un buon libro si
scopre quanto č possibile fare col C++ e con la STL, e s'impara soprattutto
che pur non essendo un linguaggio semplice, non č impossibile, anzi, certe
cose sono molto piů semplici che in C, e soprattutto piů sicure.
In particolar modo, la gestione e l'organizzazione di stringe di lunghezza
non fissa (contenute in liste o in vettori in numero non predeterminato) č
una di quelle cose per le quali il C ha mostrato da anni tutti i suoi
limiti.
Perché allora continuiamo ancora, inutilmente, a farci del male scrivendo
simile codice in C!?
#include <iostream>
#include <string>
#include <list>
#include <iterator>
#include <algorithm>
using namespace std;
template<typename T>
void stringtok(const string& S,T& v,bool saveEmpty=true,char separator=',')
{
        string::const_iterator end=S.end(); // iteratore a fine stringa
        string::const_iterator current=S.begin(); // iteratore a inizio
        while(current!=end) // se non e' finito
        {
                // post=iter di primo separatore o end se non c'č il
separat.
                string::const_iterator post=find(current,end,separator);
                // crea una stringa dalla posizione corrente a post
                string s(current,post);
                if (saveEmpty || !s.empty())
                {
                        v.push_back(s); // salva la stringa nel contenitore
                }
                if (post!=end) ++post; // se non e' finito, salta il
separatore
                current=post; // e diventa la nuova posizione corrente
        }
}
int main()
{
        string s="primo, secondo";
        // definisce una lista di stringhe
        list<string> l;
        stringtok(s,l);
        // stampa la lista di stringhe
        copy(l.begin(),l.end(),ostream_iterator<string>(cout,"\n"));
        return 0;
}

 ha scritto nel messaggio
news:_FLKc.3184$B06...@news.edisontel.com...
