Ricerca in un array di stringhe

di Anonimizzato14574 il
1 risposte
In pratica io ho un array di stringhe (cognomi) definito in questo modo:
 
char **allocaC(int dim){
	char **cognomi;
	cognomi=(char**)malloc(sizeof(char*)*dim);
	int i;
	for (i=0;i<dim;i++){
		cognomi[i]=(char*)malloc(sizeof(char)*30); 
		 cognomi[i][0]=' ';
	}
	return cognomi;
}
dato un cognome la funzione dovrebbe ritornare la posizione del cognome se presente nell'array mentre se non è presente dovrebbe ritornare -1.
Vi metto il codice della funzione (probabilmente mi da errore la strcmp).

int posCognome(char **cognomi,char *cognome, int dim){
	int i,ctrl=0;
	for (i=0;i<dim-15;i++){
		ctrl=strcmp(cognomi[i],cognome);
		if (ctrl==0){
			return i;
		}
	}
	return -1;
}
qui vi metto il codice della funzione completa (anche se è ancora da terminare) cosi vedete se ho fatto qualche errore da qualche altra parte:

// 20 nomi e cognomi, dire per ogni cognome  i nomi corrispondenti
//suppongo nome+cognome=max 30 caratteri

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **allocaC(int dim);
char ***allocaN(int dim);
void separa(char *persona,char *nome,char *cognome);
int posCognome(char **cognomi,char *cognome,int dim);
int insCognome(char *cognome,char **cognomi,int dim);

int main(int argc,char *argv[]){
	int dim=20,ctrl=0;
	char **cognomi,***nomi;
	cognomi=allocaC(dim);
	nomi=allocaN(dim);
	char buf[30];
	char *persona,*cognome,*nome;
	cognome=(char*)malloc(sizeof(char)*30);
	nome=(char*)malloc(sizeof(char)*30);
	int pos;
	while (1){
		printf("inserisci nome e cognome: ");
		persona=fgets(buf,30,stdin);
		ctrl=strcmp(persona,"FINE LISTA");
		if (ctrl==0){
			break;
		}
		separa(persona,nome,cognome);
		printf("nome: %s\n",nome);
		printf("cognome: %s\n",cognome);
		pos=posCognome(cognomi,cognome,dim);
		printf("pos: %d",pos);
		if (pos==-1){
			pos=insCognome(cognome,cognomi,dim);
		}
	}
}

char **allocaC(int dim){
	char **cognomi;
	cognomi=(char**)malloc(sizeof(char*)*dim);
	int i;
	for (i=0;i<dim;i++){
		cognomi[i]=(char*)malloc(sizeof(char)*30); 
		 cognomi[i][0]=' ';
	}
	return cognomi;
}

char ***allocaN(int dim){
	char ***nomi;
	nomi=(char***)malloc(sizeof(char*)*dim);
	int i,j;
	for (i=0;i<dim;i++){
		nomi[i]=(char**)malloc(sizeof(char*)*dim); 
		for (j=0;j<dim;j++){
			nomi[i][j]=(char*)malloc(sizeof(char));
		}
	}
	return nomi;
}

void separa(char *persona,char *nome,char *cognome){
	char temp;
	int i=0,pos=0;
	int lun;
	lun=strlen(persona);
	while (1){
		temp=persona[i];
		if (temp<=32){
			break;
		}
		nome[pos]=temp;
		pos++;
		i++;
	}
	pos=0;
	i++;
	
	while (1){
		temp=persona[i];
		cognome[pos]=temp;
		pos++;
		i++;
		if (i>lun-1){
			break;
		}
	}
	printf("ciao \n");
}

int posCognome(char **cognomi,char *cognome, int dim){
	int i,ctrl=0;
	for (i=0;i<dim-15;i++){
		ctrl=strcmp(cognomi[i],cognome);
		if (ctrl==0){
			return i;
		}
	}
	return -1;
}

int insCognome(char *cognome,char **cognomi,int dim){
	int i;
	char ctrl;
	for (i=0;i<dim;i++){
		ctrl=strcmp(cognomi[i],NULL);
		if (ctrl!=0){
			strcpy(cognomi[i],cognome);
			printf("inserimento cognome: %s",cognomi[i]);
			return i;
		}
	}
	
	return -1;
}

1 Risposte

  • Non so se puoi fare una roba del genere, perchè morta la funzione alloca cognomi, muoiono con se anche tutte le variabili al suo interno(in questo caso cognomi in allocaC), e anche le allocazioni saranno solo garbage nella memoria.


    Ora provo a farlo anche io questo esercizio e poi posto
Devi accedere o registrarti per scrivere nel forum
1 risposte