PDA

Visualizza la versione completa : segmentation fault in c++ linux


vincienalotto
07-02-2013, 17:32
Salve, ho scritto questo codice.
Se trovo la persona funziona bene
Se scrivo qualcosa casualmente Segmentation fault (core dumped)
Se non scrivo niente mi viene fuori: �F���k��F���������� -1452

Che devo fare?



#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

int main(){

struct dati {
char* nome;
char* cognome;
short int eta;
};

dati dade[10];
char cerca[10];

//Dati di esempio
dade[0].nome= "Davide";
dade[0].cognome= "Cavallini";
dade[0].eta = 25;
dade[1].nome= "Elena";
dade[1].cognome= "Berti";
dade[1].eta = 23;
//

cout << "Cerca: ";
cin.getline(cerca,sizeof(cerca));

for(int a=0; sizeof(dade); a++){
if(strncmp(cerca,dade[a].nome, 4)==0 || strncmp(cerca,dade[a].cognome, 4)==0){
cout << dade[a].nome << " " << dade[a].cognome << " " <<dade[a].eta << endl;
return 0;
} }
cout << "Risultato non trovato" ;
}

vincienalotto
07-02-2013, 19:18
Ho risolto così:


#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

int main(){

struct dati {
char* nome;
char* cognome;
short int eta;
};

dati dade[10];
char cerca[10];

for(int i=0; i<sizeof(dade); i++){
dade[i].nome=(char*)malloc(sizeof(char)*20);
dade[i].cognome=(char*)malloc(sizeof(char)*20);
}

//Dati di esempio
dade[0].nome= "Davide";
dade[0].cognome= "Cavallini";
dade[0].eta = 25;

dade[1].nome= "Elena";
dade[1].cognome= "Berti";
dade[1].eta = 23;

dade[2].nome= "Sara";
dade[2].cognome= "Tagliapietra";
dade[2].eta = 22;
//


cout << "Cerca: ";
cin.getline(cerca,sizeof(cerca));


for(int a=0; strlen(dade[a].nome)>1; a++){
if(strncmp(cerca,dade[a].nome, 4)==0 || strncmp(cerca,dade[a].cognome, 4)==0){
cout << dade[a].nome << " " << dade[a].cognome << " " <<dade[a].eta << endl;
return main();
}
}
cout << "Risultato non trovato"<<endl; ;
return main();
}

oregon
07-02-2013, 19:22
Questo è comunque sbagliato ...

dade[0].nome= "Davide";
dade[0].cognome= "Cavallini";

deve essere

strcpy(dade[0].nome, "Davide");
strcpy(dade[0].cognome, "Cavallini");

e così via per le stringhe.

vincienalotto
08-02-2013, 13:51
ll'assegnazione in struct funziona perfettamente. qui invece dove sbaglio?



int b=0;
char s;
for(int a=0;s=fgetc(files)!=EOF;){ //quando trovi la fine del file finisci il ciclo
//quando trovi la newline finisci il ciclo
while(s=getc(files)!=','){ //quando trovi la virgola finisci il ciclo
dade[b].nome[a]=s;//memorizza il carattere s nell'array
a++;
};
while(s=getc(files)!=','){ //quando trovi la virgola finisci il ciclo
dade[b].cognome[a]=s;//memorizza il carattere s nell'array
a++;
};
while(s=getc(files)!='\n'){ //quando trovi la newline finisci il ciclo
dade[b].eta[a]=s;//memorizza il carattere s nell'array
a++;
};
b++;
};


Errore


Cerca: davide
Nome Cognome Eta
Risultato non trovato
Segmentation fault (core dumped)


File txt


Davide,Cavallini,25
Sara,Tagliapietra,22
Elena,Berti,23


Io vorrei che leggesse e mi stampasse a schermo, cercando davide ad esempio
Davide\tCavallini\t25

oregon
08-02-2013, 13:54
Originariamente inviato da vincienalotto
ll'assegnazione in struct funziona perfettamente.

Hai fatto come ti ho detto?


qui invece dove sbaglio?

Controlla i valori dell'indice a nei cicli ...

vincienalotto
08-02-2013, 14:30
no, funziona perfettamente lo stesso senza errori di compilazione e neanche warning.
sto cercando di capire bene qua come funziona, ma è un casino.

Ho provato anche cosi ma niente, nessun risultato


int a=0;
char s;
//ripeti il ciclo finche finisce il file
for(int b=0;s=fgetc(files)!=EOF;b++){
//leggi lettera e memorizzala in dade[0].nome[1,2,3,ecc] finke trovi la ,
while(s=fgetc(files)!=','){
a++;
dade[b].nome[a]=s;
}
//leggi lettera e memorizzala in dade[0].cognome[1,2,3,ecc] finke trovi la ,
while(s=fgetc(files)!=','){
a++;
dade[b].cognome[a]=s;
}
//leggi lettera e memorizzala in dade[0].eta[1,2,3] finke trovi \n o eof
while(s=fgetc(files)!='\n'){
if(s=fgetc(files)==EOF) break;
a++;
dade[b].eta[a]=s;
}
}

oregon
08-02-2013, 14:46
Originariamente inviato da vincienalotto
no, funziona perfettamente lo stesso senza errori di compilazione e neanche warning.

Ciò non vuol dire che non sia sbagliato.

Hai allocato dinamicamente la memoria per quelle stringhe e le devi copiare con la strcpy. Se non lo fai, commetti un errore.

vincienalotto
08-02-2013, 14:56
ok, ma comunque sia adesso le stringhe sono commentate quindi non è quello l'errore.
poi non capisco perchè se alloco dinamicamente l'età mi da segmentation fault cioè:



for(int i=0; i<sizeof(dade); i++){
dade[i].nome=(char*)malloc(sizeof(char)*20);
dade[i].cognome=(char*)malloc(sizeof(char)*20);
dade[i].eta=(char*)malloc(sizeof(char)*20);
}


invece cosi funziona



for(int i=0; i<sizeof(dade); i++){
dade[i].nome=(char*)malloc(sizeof(char)*20);
dade[i].cognome=(char*)malloc(sizeof(char)*20);
}


La struct è questa


struct dati {
char* nome;
char* cognome;
char* eta;
};

dati dade[20];

vincienalotto
08-02-2013, 15:01
ok, ho risolto i problemi di segmentazione. avevo sbagliato a dargli sizeof(dade)come parametro, pensando che restituisse 20. adesso resta però il problema che non memorizza niente negli array

oregon
08-02-2013, 15:26
eta è un intero non una stringa ... la malloc non c'entra nulla.

Loading