Oppure

Loading
04/06/09 14:46
Lawliet
Ciao a tutti, Vi posto il mio piccolo problema... dichiarando nel main o dove serve così: char *<identificatore>;
un array di caratteri senza dichiarare la dimensione...

e poi successivamente uso la funzione gets(char *<identificatore); prendo da tastiera una stringa di cui non so la dimensione cioè quella dichiarata prima...però.. mi fa errore, perchè?
Ci vuole per forza una variabile con dimensione dichiarata?
aaa
04/06/09 16:08
dichiarando semplicemente

char *variabile;

stai dichiarando un puntatore ad un char^^
Ma devi dargli un indirizzo di memoria a cui punntare :)

variabile = (char *) malloc(dim_stringa*sizeof(char));

Quindi in risposta alla tua domanda:
si devi sapere cmq la dimensione della stringa^^
04/06/09 16:36
Lawliet
Quindi devo per forza dichiarare anche nelle funzioni dove passo per parametro la char??? perchè ho provato a lasciarla così (cioè char <identificatore>[100] mentre nelle funzioni char *<identificatore>;)... mi dà come effetto collaterale cioè quando salvo nella in una struttura...che succede? tutti gli elementi inseriti vengono tutte modificate assumendo l'ultima stringa inserita.
aaa
04/06/09 17:34
lorenzo
attento che l'operatore * indica un puntatore.
quindi passando un puntatore e modificando la sua variabile modifichi il contenuto dell'indirizzo di memoria.
per questo le altre stringhe si modificano con l'ultima inserita

posta il tuo codice che magari si capisce meglio il problema
aaa
05/06/09 14:22
Lawliet
"per questo le altre stringhe si modificano con l'ultima inserita "
Come avevo immaginato allora... quindi devo pure dichiarare la dimensione ai parametri nelle funzioni.
E scusate... non c'è un modo di dichiarare le variabili di tipo stringa senza dimensione? Ovviamente senza causare effetti collaterali?? Io vorrei che la dimensione venga assunta quando l'utente inserisce la stringa da tastiera.
aaa
05/06/09 14:36
lorenzo
ancora non capisco...posta il tuo codice

comunque in una funzione farai:

void func(char *s)
{
 char *s2 = new char[20];
 strcpy(s2, s);//se vuoi modificarla modifichi s2 adesso
               //in questo modo hai una copia di s che non 
               //punta al suo stesso indirizzo
               //ricorda che non puoi usare = con le stringhe
}

e nel main
int main()
{
  char *s = new char[20];//per esempio
  gets(s);
  func(s);
}


però te lo ripeto: posta il tuo codice se no non si capirà mai di cosa hai veramente bisogno
aaa
05/06/09 15:32
Lawliet
Non è un solo codice, ma un progetto
comunque è semplice per far veloce:

int main()
{
char stringa[100];
gets(stringa);
add(stringa); //chiamo la funzione per aggiungere nella struttura dichiarata in un altro modulo
..
...
}

la struttura l'ho dichiarata globale e n è il numero di elementi inseriti.

void add(char *stringa)
{
strcpy(struttura[n].string, stringa)//uso per copiare nella struttura
n++;
}

Questo è un esempio veloce... facendo così come hai detto tu si incollano tutte le stringhe all'ultima inserita.
Per evitare questo devo mettere char stringa[100]; come parametro nella funzione...
Se io non voglio mettere la dimensione e farlo quando viene inserito da tastiera una stringa.. si può?
E poi tu hai utilizzato "new" questo mi sarà sfuggito... devo rileggere un attimo il libro o.O'





aaa
05/06/09 15:56
theprogrammer
La new e' del C++, mentre la richiesta e' per il C ...

Pero' non ho ancora capito la richiesta ...

La gets non prevede una dimensione per il buffer (e per questo e' comunque sconsigliabile in quanto fonte di buffer overflow) ...

Meglio la fgets (utilizzando stdin per il file) in modo da specificare la lunghezza massima del buffer. Ma il buffer deve essere COMUNQUE allocato (con la malloc nel tuo caso).
aaa