PDA

View Full Version : [C] problema con puntatori e stringhe


matteo.pata
23-04-2010, 15:15
Ragazzi ho una funzione che fa un inserimento in lista:


listaGrattacielo* inserisci(listaGrattacielo *p, int pos_i,int pos_f,float h,char *n)
{
printf("%s nome da assegnare al grattacielo\n",n);
listaGrattacielo *q = malloc(sizeof(listaGrattacielo)); /* creo il nodo*/

if(!q) {
fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
exit(-1);
}
q->nome = n; /* Assegno le variabile passate come parametro*/
q->pos_iniziale = pos_i;
q->pos_finale = pos_f;
q->altezza = h;
q->next = p;
return q; /*ritorno la lista aggiornata*/
}


praticamente quando vado a chiamare questa funzione in questo caso:

fscanf(p,"%s",&linea);
if(strcmp(linea,"new")==0){
fscanf(p,"%s",stringa); /*inserimento grattacielo*/
fscanf(p,"%d",&posi);
fscanf(p,"%d",&posf);
fscanf(p,"%f",&altezza);
Grattacieli = inserisci(Grattacieli,posi,posf,altezza,stringa);

io prendo gli input da un file di testo e chiamo la funzione inserisci però non gli passo un char* perchè la fscanf non mi restiutisce un char* ma un indirizzo di memoria giusto??Quindi come faccio a mandargli un char* alla mia funzione di inserimento?come faccio ad assegnare il mio indirizzo di memoria al mio char* per poi passare il tutto....:help: :help:

cionci
23-04-2010, 16:06
Un char * è un puntatore, quindi contiene un indirizzo di memoria.
Ci puoi far vedere come hai dichiaro e allocato stringa e line ?

matteo.pata
23-04-2010, 16:08
char stringa[120];
char linea[120]

le ho dichiarate così...

Darecon
23-04-2010, 16:08
fscanf(p,"%s",&stringa); /*inserimento grattacielo*/

Senza & direi.. :D O almeno io ho sempre fatto cosi' con la fscanf ed e' sempre andato.. :D

Discorso diverso per interi float ecc.. :)

Va che tra poco finisce il tempo per il progetto.. :p

cionci
23-04-2010, 16:10
Senza &...gli identificatori dei vettori sono già puntatori.

matteo.pata
23-04-2010, 16:14
fscanf(p,"%s",&stringa); /*inserimento grattacielo*/

Senza & direi.. :D O almeno io ho sempre fatto cosi' con la fscanf ed e' sempre andato.. :D

Discorso diverso per interi float ecc.. :)

Va che tra poco finisce il tempo per il progetto.. :p

sisi infatti le ho tolte ma non cambia cavolo...da riga di comando va perfettamente se gli passo il file scrive sempre lo stesso nome del grattacielo e + precisamente scrive il nome che inserisco per ultimo e cambia anche tutti gli altri.Sicuramente è un problema di puntatori e indirizzi e mi sto incasinando datemi una mano please.

Darecon
23-04-2010, 16:16
sisi infatti le ho tolte ma non cambia cavolo...da riga di comando va perfettamente se gli passo il file scrive sempre lo stesso nome del grattacielo e + precisamente scrive il nome che inserisco per ultimo e cambia anche tutti gli altri.Sicuramente è un problema di puntatori e indirizzi e mi sto incasinando datemi una mano please.

La copia della stringa la fai con la strcpy() vero? perche' se fai:
char* st1;
st1=st2;

semplicemente assegni l'indirizzo del puntatore, non lo copi.. Se e' questo il problema.. Da come lo descrivi direi di si, dai un occhio.. :)

matteo.pata
23-04-2010, 16:19
in che senso nella mia struttura dati formata così:

typedef struct listaGrattacielo{
char *nome; /* nome grattacielo*/
int pos_iniziale; /* posizione iniziale spiaggia*/
int pos_finale; /* posizione finale spiaggia*/
float altezza; /*altezza grattacielo*/
struct listaGrattacielo *next;
}listaGrattacielo;

poi ho la funzione inserisci scritta sopra e faccio l'assegnamento in questo modo

q->nome = n dove n è il parametro passato alla funzione ed è sempre di tipo char*

Darecon
23-04-2010, 16:21
in che senso nella mia struttura dati formata così:

typedef struct listaGrattacielo{
char *nome; /* nome grattacielo*/
int pos_iniziale; /* posizione iniziale spiaggia*/
int pos_finale; /* posizione finale spiaggia*/
float altezza; /*altezza grattacielo*/
struct listaGrattacielo *next;
}listaGrattacielo;

poi ho la funzione inserisci scritta sopra e faccio l'assegnamento in questo modo

q->nome = n dove n è il parametro passato alla funzione ed è sempre di tipo char*

strcpy(q->nome,n);

;)

altrimenti assegni l'indirizzo di n.. :D

slartibartfast
23-04-2010, 16:22
in che senso nella mia struttura dati formata così:

typedef struct listaGrattacielo{
char *nome; /* nome grattacielo*/
int pos_iniziale; /* posizione iniziale spiaggia*/
int pos_finale; /* posizione finale spiaggia*/
float altezza; /*altezza grattacielo*/
struct listaGrattacielo *next;
}listaGrattacielo;

poi ho la funzione inserisci scritta sopra e faccio l'assegnamento in questo modo

q->nome = n dove n è il parametro passato alla funzione ed è sempre di tipo char*

ma *nome lo hai allocato con un malloc ?

matteo.pata
23-04-2010, 16:24
crasha...facendo così....

Darecon
23-04-2010, 16:24
ma *nome lo hai allocato con un malloc ?

crasha...facendo così....

Mi sono dimenticato di questo..

Hai allocato il nome da qualche parte?

matteo.pata
23-04-2010, 16:24
ma *nome lo hai allocato con un malloc ?

mmm no non è allocato con malloc....

slartibartfast
23-04-2010, 16:25
mmm no non è allocato con malloc....

Ti credo che crasha :asd:

Darecon
23-04-2010, 16:25
typedef struct listaGrattacielo{
char nome[200]; /* nome grattacielo*/
int pos_iniziale; /* posizione iniziale spiaggia*/
int pos_finale; /* posizione finale spiaggia*/
float altezza; /*altezza grattacielo*/
struct listaGrattacielo *next;
}listaGrattacielo;

E usa la strcpy per copiare le stringhe..

matteo.pata
23-04-2010, 16:30
ok ho risolto il problema per leggere da file adesso il problema e da riga di comando in quanto io avevo fatto una funzione che mi leggeva il nome da riga di comando:


char* leggiNome(char c) {
int i = 1;
char *nome = malloc(2 * sizeof(char));
while((c >= 'a' && c <= 'z')||(c=='!')||(c=='?')||(c >= 'A' && c <= 'Z')) {
nome[i - 1] = c;
nome = (char *)realloc(nome, ++i * sizeof(char)); /* Aggiungiamo un elemento */
c = getchar();
}
nome[i - 1] = '\0'; /* Fine nome */
return nome;
}

e mi restituiva un puntatore e poi lo assegnavo ad n infatti se lo lacnio con file nessun problema se invece inserisco da riga di comanda crasha....
ancora un piccolo aiuto....

Darecon
23-04-2010, 16:36
ok ho risolto il problema per leggere da file adesso il problema e da riga di comando in quanto io avevo fatto una funzione che mi leggeva il nome da riga di comando:


char* leggiNome(char c) {
int i = 1;
char *nome = malloc(2 * sizeof(char));
while((c >= 'a' && c <= 'z')||(c=='!')||(c=='?')||(c >= 'A' && c <= 'Z')) {
nome[i - 1] = c;
nome = (char *)realloc(nome, ++i * sizeof(char)); /* Aggiungiamo un elemento */
c = getchar();
}
nome[i - 1] = '\0'; /* Fine nome */
return nome;
}

e mi restituiva un puntatore e poi lo assegnavo ad n infatti se lo lacnio con file nessun problema se invece inserisco da riga di comanda crasha....
ancora un piccolo aiuto....

Non capisco cosa deve fare questa funzione.. Leggere una stringa da riga di comando? Usare una scanf??