Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    segmentation fault in c++ linux

    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?

    codice:
    #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" ;  
    }

  2. #2
    Ho risolto così:
    codice:
    #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();
    }

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    ll'assegnazione in struct funziona perfettamente. qui invece dove sbaglio?

    codice:
    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
    codice:
    Cerca: davide
    Nome	Cognome	Eta
    Risultato non trovato
    Segmentation fault (core dumped)
    File txt
    codice:
    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

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    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
    codice:
    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;
    	}
    }

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    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è:

    codice:
    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

    codice:
    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
    codice:
    struct dati {
    char* nome;
    char* cognome;
    char* eta;
    };
    
    dati dade[20];

  9. #9
    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

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    eta è un intero non una stringa ... la malloc non c'entra nulla.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.