Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Errore gets()
Forum - C/C++ - Errore gets()

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 16:46
Giovedì, 04/06/2009
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?

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:08
Giovedì, 04/06/2009
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^^

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 18:36
Giovedì, 04/06/2009
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.

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 19:34
Giovedì, 04/06/2009
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

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 16:22
Venerdì, 05/06/2009
"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.

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 16:36
Venerdì, 05/06/2009
ancora non capisco...posta il tuo codice

comunque in una funzione farai:

Codice sorgente - presumibilmente C/C++

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


e nel main
Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.   char *s = new char[20];//per esempio
  4.   gets(s);
  5.   func(s);
  6. }



però te lo ripeto: posta il tuo codice se no non si capirà mai di cosa hai veramente bisogno

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 17:32
Venerdì, 05/06/2009
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'






PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 17:56
Venerdì, 05/06/2009
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).

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 18:14
Venerdì, 05/06/2009
Ma perchè devo usare queste cose cioè dichiarare la dimensione o allocare... ma se la funzione gets() sta pure scritto che legge fino al terminatore o newline in questo caso che serve a me. Perchè non funziona? :|

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo