Confronto tra stringhe di caratteri C++

di il
6 risposte

Confronto tra stringhe di caratteri C++

Ho due strutture e devo confrontare la matricola della prima struttura con la matricola(m) della seconda struttura per vedere se sono uguali o meno.
Il problema è che anche inserendo le matricole uguali(cioè lista.matricola e terna.m) mi dice sempre che non è stata trovata nessuna matricola uguale, perchè?
Se invece utilizzo degli int e non dei char non mi da questi problemi e funziona.

int ricerca(Laureando lista[], Terna terna, int n){
int pos=-1;
int i=0;
while(i<n && pos<0){
if(strcmp(terna.m,lista.matricola)==0){
pos=i;
}
else{
i++;
}
}
return(pos);
}

6 Risposte

  • Re: Confronto tra stringhe di caratteri C++

    Detta così non è possibile darti una risposta.

    Bisogna vedere le strutture, la chiamata, i dati effettivamente contenuti nelle stringhe ...
  • Re: Confronto tra stringhe di caratteri C++

    oregon ha scritto:


    Detta così non è possibile darti una risposta.

    Bisogna vedere le strutture, la chiamata, i dati effettivamente contenuti nelle stringhe ...
    
    struct Laureando {
    	char cognome[32];
    	char nome[32];
    	char cds[4];
    	char matricola[10];
    	double media;
    };
    
    struct Terna{
    	char m[10];
    	char c[32];
    	char n[32];
    }terna;
    
    void read(Laureando listain[],int n);
    void sortbymatricola(Laureando listain[],int n);
    void readterna(Terna terna);
    int ricerca(Laureando listain[], Terna terna,int n);
    
    int main(){
    int n;
    int k,pos;
    Laureando listain[MAXNUM];
    do{
    	cout<<"inserisci numero di studenti:"<<endl;
    	cin>>n;
    } while(n<0 || n>MAXNUM);
    read(listain,n);
    sortbymatricola(listain,n);
    cout<<"inserisci k:"<<endl;
    cin>>k;
    for(int i=0; i<k; i++){
    readterna(terna);
    pos=ricerca(listain,terna,n);
    if(pos>=0){
    	cout<<"trovato uno studente con matricola m"<<pos<<endl;
    	else{
    	cout<<"nessuno studente con matricola m"<<endl;
    }
    }
    return 0;
    }
    
    Vabbè non ti posto le dichiarazioni delle funzioni read e sortbymatricola perchè quelle funzionano, il problema credo stia nella funzione "ricerca" che ho postato all'inzio.
  • Re: Confronto tra stringhe di caratteri C++

    Anche così non si può determinare il problema...

    Posta tutto il codice da copiare-incollare e compilare senza errori.
  • Re: Confronto tra stringhe di caratteri C++

    oregon ha scritto:


    Anche così non si può determinare il problema...

    Posta tutto il codice da copiare-incollare e compilare senza errori.
    Eccolo:
    
    #include <iostream>
    #define MAXNUM 1000
    #include <cstring>
    using namespace std;
    
    struct Laureando {
    	char cognome[32];
    	char nome[32];
    	char cds[4];
    	char matricola[10];
    	double media;
    };
    
    struct Terna{
    	char m[10];
    	char c[32];
    	char n[32];
    }terna;
    
    void read(Laureando listain[],int n);
    void sortbymatricola(Laureando listain[],int n);
    void readterna(Terna terna);
    int ricerca(Laureando listain[], Terna terna,int n);
    void copia(Laureando listain[], Laureando listaout[],int pos, int n);
    void elimina(Laureando listain[],int pos,int n);
    void stampa(Laureando listain[], Laureando listaout[],int n, int k);
    int main(){
    int n;
    int k,pos;
    Laureando listain[MAXNUM],listaout[MAXNUM];
    do{
    	cout<<"inserisci numero di studenti:"<<endl;
    	cin>>n;
    } while(n<0 || n>MAXNUM);
    read(listain,n);
    sortbymatricola(listain,n);
    cout<<"inserisci k:"<<endl;
    cin>>k;
    for(int i=0; i<k; i++){
    readterna(terna);
    pos=ricerca(listain,terna,n);
    if(pos>=0){
    	cout<<"trovato uno studente con matricola m"<<pos<<endl;
    	if((strcmp(listain[pos].cognome,terna.c)==0) && (strcmp(listain[pos].nome,terna.n)==0)){
    		cout<<"il nome e il cognome dello studente trovato sono uguali a C e N"<<endl;
    		copia(listain,listaout,pos,n);
    		elimina(listain,pos,n);
    		n--;
    		stampa(listain,listaout,n,k);
    	}
    	else{
    		cout<<"il nome e il cognome dello studente trovato sono diversi da C e N"<<endl;
    	}
    }
    else{
    	cout<<"nessuno studente con matricola m"<<endl;
    }
    }
    
    return 0;
    }
    void read(Laureando listain[],int n){
    	bool corretto;
    	for(int i=0; i<n; i++){
    		cin.ignore(1000,'\n');
    		cout<<"Laureando numero"<<" "<<i<<endl;
    		cout<<"inserisci cognome:"<<endl;
    		cin.getline(listain[i].cognome,32);
    		cout<<"inserisci nome:"<<endl;
    		cin.getline(listain[i].nome,32);
    		cout<<"inserisci corso di studi (INF,IND,CIV):"<<endl;
    		do{
    			cin.getline(listain[i].cds,4);
    			if((strcmp(listain[i].cds,"INF")==0) || (strcmp(listain[i].cds,"CIV")==0) ||
    					(strcmp(listain[i].cds,"IND")==0)){
    				corretto=true;
    			}
    			else {
    				corretto=false;
    			}
    		}while(!corretto);
    		cout<<"inserisci matricola:"<<endl;
    		cin>>listain[i].matricola;
    		cout<<"inserisci media dei voti:"<<endl;
    		cin>>listain[i].media;
    	}
    }
    void sortbymatricola(Laureando listain[],int n){
    	bool fattoswap;
    	int last=0;
    	int end;
    	do{
    		end=last;
    		fattoswap=false;
    		for(int i=n-1; i>end; i--){
    			if(listain[i].matricola<listain[i-1].matricola){
                  Laureando appo=listain[i];
                  listain[i]=listain[i-1];
                  listain[i-1]=appo;
                  last=i;
                  fattoswap=true;
    			}
    		}
    	}while(fattoswap);
    }
    void readterna(Terna terna){
    	cin.ignore(80,'\n');
    	cout<<"inserisci m:"<<endl;
    	cin.getline(terna.m,10);
    	cout<<"inserisci c:"<<endl;
    	cin.getline(terna.c,32);
    	cout<<"inserisci n:"<<endl;
    	cin.getline(terna.n,32);
    
    
    }
    int ricerca(Laureando listain[], Terna terna, int n){
    	int pos=-1;
    	int i=0;
    	while(i<n && pos<0){
    		if(strcmp(terna.m,listain[i].matricola)==0){
    			pos=i;
    		}
    		else{
    			i++;
    		}
    	}
    	return(pos);
    }
    void copia(Laureando listain[], Laureando listaout[],int pos,int n){
    	int j=0;
    	for(int i=0; i<n; i++){
    		listaout[j]=listain[pos];
    		j++;
    	}
    }
    void elimina(Laureando listain[],int pos,int n){
    	for(int i=pos; i<n-1; i++){
    		listain[i]=listain[i+1];
    	}
    }
    void stampa(Laureando listain[], Laureando listaout[],int n, int k){
    	cout<<"elenco iniziale:"<<endl;
    	for(int i=0; i<n; i++){
    		cout<<listain[i].cognome<<endl;
    		cout<<listain[i].nome<<endl;
    		cout<<listain[i].cds<<endl;
    		cout<<listain[i].matricola<<endl;
    		cout<<listain[i].media<<endl;
    	}
    	cout<<"elenco finale:"<<endl;
    	for(int i=0; i<k; i++){
    		cout<<listaout[i].cognome<<endl;
    		cout<<listaout[i].nome<<endl;
    		cout<<listaout[i].cds<<endl;
    		cout<<listaout[i].matricola<<endl;
    		cout<<listaout[i].media<<endl;
    	}
    }
    
  • Re: Confronto tra stringhe di caratteri C++

    La funzione readterna deve passare il suo parametro per puntatore altrimenti i dati saranno persi. Quindi

    void readterna(Terna *terna)

    e il codice al suo interno va modificato di conseguenza. E la chiamata sarà

    readterna(&terna);
  • Re: Confronto tra stringhe di caratteri C++

    oregon ha scritto:


    La funzione readterna deve passare il suo parametro per puntatore altrimenti i dati saranno persi. Quindi

    void readterna(Terna *terna)

    e il codice al suo interno va modificato di conseguenza. E la chiamata sarà

    readterna(&terna);
    Ah ecco,grazie mille!
Devi accedere o registrarti per scrivere nel forum
6 risposte