• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Zeroone

ajuda- pesquisa

8 mensagens neste tópico

Ola malta, é assim eu estou a utilizar a leitura de um ficheiro e carrego-o num vector realocando a memoria, mas tenho um problema, o vector fica bem carregado mas no momento de peskisa em ke faz a comparaçao de elementos do tipo string imtroduzidos pelo utilizador com akeles ke estao no vector, nao sei pk mas nao funca, com o campo codigo funciona bem pois é do tipo inteiro e rola bem e faz bem a peskisa, o problema é mesmo os outros campos ke sao do tipo char

alguem me pode explicar como resolver este problema???

#include <stdio.h>
#include<stdlib.h> //biblioteca que chama o system("cls");
#include <conio.h>
#define max 20

typedef struct{
int codigo;
char nome[max];
char date[max];
char local[max];
char type[max];

}foto;

int ler_registos(foto **w);
void escrever_registos(foto *w, int size);
void escrever(foto *w, int i);


void main(void)
{
foto *v=NULL,aux;
int i,n,a=0,size;
size=ler_registos(&v);
char search;

        n=0;



switch(size)
{
case -2: printf("ERRO NA ABERTURA DO FICHEIRO\7\n");
	     a=1;
		 fflush(stdin);
             getchar();
	break;
case -1: printf("ERRO NA ALOCÇAO DE MEMORIA\7\n");
	     a=1; 
		 fflush(stdin);
             getchar();
	break;
default:
//	escrever_registos(v,size);
//	free(v);



    while(a != 1)
{
    
    system("cls");//lipa ecran

    printf("                  \n FORAM LIDOS NO TOTAL %d REGISTOS EXISTENTES NO FICHEIRO\n",size);
printf(" \n *** ESCOLHA O TIPO DE PESQUISA QUE PRETENDE EFECTUAR ***\n\n");
printf("   _______________________________\n");
printf("  |                               |\n");     
printf("  |  (N)- NOME                    |\n");
printf("  |  (D)- DATA                    |\n");
printf("  |  (T)- TIPO                    |\n");
printf("  |  (L)- LOCALIZACAO             |\n");
printf("  |  (C)- CODIGO                  |\n"); 
    printf("  |                               |\n");
    printf("  |  (S)- SAIR                    |\n");
printf("  |_______________________________|\n\n\n");

         
    
printf(" SELECCIONE A OPCAO PRETENDIDA: ");
scanf(" %c",&search);

    system("cls");//lipa ecran
    printf("\n\n");






	   switch(search)
	   {
	   case 's':
	   case 'S':a=1;
		        break;
	   case 'n':
	   case 'N':printf(" Intruduza o NOME a pesquisar : ");
				 scanf("%s",&aux.nome);


           
				 for(i=0;i<size;i++)
				 {

				   if((v[i].nome) == aux.nome) 
				   {
					 printf("%s %s %s %s %d\n",v[i].nome,v[i].date, v[i].local,v[i].type, v[i].codigo);

				   }

				 }break;
	   case 'd':
	   case 'D':printf("          Intruduza a DATA a pesquisar (DD/MM/AAAA): ");
				 scanf("%s",&aux.date);

				 for(i=0;i<size;i++)
				 {

					if(v[i].date == aux.date)
					{
						printf("%s %s %s %s %d\n",v[i].nome,v[i].date, v[i].local,v[i].type, v[i].codigo);
					}
				 }break;

	   case 't':
	   case 'T':printf("          Intruduza o TIPO a pesquisar: ");
				 scanf("%s",&aux.type);

				 for(i=0;i<size;i++)
				 {

					if(v[i].type == aux.type)
					{
						printf("%s %s %s %s %d\n",v[i].nome,v[i].date, v[i].local,v[i].type, v[i].codigo);
					}
				 }break;

	   case 'l':
	   case 'L':printf("          Intruduza a LOCALIZACAO a pesquisar: ");
				 scanf("%s",&aux.local);

				 for(i=0;i<size;i++)
				 {

					if(v[i].local == aux.local)
					{
						printf("%s %s %s %s %d\n",v[i].nome,v[i].date, v[i].local,v[i].type, v[i].codigo);
					}
				 }break;

	   case 'c':
	   case 'C':{printf("          Intruduza o CODIGO a pesquisar: ");
				 scanf("%d",&aux.codigo);
				 printf("\n");

				 for(i=0;i<size;i++)
				 {

					if(v[i].codigo == aux.codigo)
					{

						escrever(v,i);
						n=n++;

                           
					}

				    
					if((i+1) == size && n==0)
					{

						printf("NAO FORAM ENCONTRADOS REGISTOS");


					}
				 }     
				 fflush(stdin);
                     getchar();

				 break;}






	   default : printf("\n                  ERROR: ENTRADA INVALIDA\7\7\n"); fflush(stdin);getchar();
		         



	}
}

free(v);
}






}

int ler_registos(foto **w)
{
FILE *fp;
int i=0;
if((fp=fopen("a.txt","r"))==NULL)
	return(-2);
while(!feof(fp))
{
if((*w=(foto *)realloc(*w,(i+1)*sizeof(foto)))!=NULL)
{
	fscanf(fp,"%s %s %s %s %d\n",(*w)[i].nome,(*w)[i].date,(*w)[i].local,(*w)[i].type, &((*w)[i].codigo));
	i++;
}
else
{
	fclose(fp);
	return(-1);
}
}
fclose(fp);
return(i);
}




















void escrever_registos(foto *w, int size)
{
int i;
for(i=0;i<size;i++)
	printf("%s %s %s %s %d\n",w[i].nome,w[i].date, w[i].local,w[i].type, w[i].codigo);
}


void escrever(foto *w, int i)
{
        printf("%s %s %s %s %d\n",w[i].nome,w[i].date, w[i].local,w[i].type, w[i].codigo);

}

CUMPS Zero

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em C para comparar strings tens de usar o comando strcmp, que significa stringcompare.

Por exemplo o seguinte código testa se as strings são iguais:

if ( strcmp(date,data) == 0) { .....  }

Este código testa se são diferentes:

if ( strcmp(date,data) != 0) { ...... }

Ou seja, e pegando um pouco do teu código, em vez de

 if(v.date == aux.date)

tens de pôr

 if(strcmp(v.date, aux.date) == 0)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

yah, obrigado funcionou era mesmo isso ke pretendia, diz-me so mais uma coisa

eu estou a usar este print

printf("%s %s %s %s %d\n",w.nome,w.date, w.local,w.type, w.codigo);

mas passa-se o seguinte gostaria de ter os dados nome data etc etc todos tabulados , e nao consigo faze-lo devido por exemplo ás strings dos nomes ke nao tem o mesmo comprimento, e entao fica tudo desalinhado nao é possivel tabular isto tudo????

semttuloxu5.png

por exemplo neste caso os dois nomes tem um tamanho mt diferente, e ao fazer o print, fica assim tudo eskuesito gostava de ter o print mais ao menos assim

lg                        10/05/2003      CD0      foto         1349       

playstation         10/05/2003      CD0      foto         1349

xxxx                   ddddddddd       lllllll       yyyyy      tttttt

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes usar o \t

printf("%s\t %s\t %s\t %s\t %d\t\n",w.nome,w.date, w.local,w.type, w.codigo);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim, ja experimentei, mas nao fica direito

fica assim, ainda é pior

semttulool0.png

nao deve ser possivel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É que na consola não cabe tudo numa linha, pasa para a seguinte.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema nao é esse, é mesmo porque ao usar o \t ele alinha pelo tab seguinte. Se uma string for demasiado grande que a outra, pode nao alinhar todos pelo mesmo.

As soluções que me lembro são demasiado complicadas para serem uteis, mas passavam por ver qual a maior, e imprimir os espaços em branco à mão..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema nao é esse, é mesmo porque ao usar o \t ele alinha pelo tab seguinte. Se uma string for demasiado grande que a outra, pode nao alinhar todos pelo mesmo.

As soluções que me lembro são demasiado complicadas para serem uteis, mas passavam por ver qual a maior, e imprimir os espaços em branco à mão..

Também é uma solução mas não é muito aconselhavel porque nós podemos necessitar uma vezes de inserir uma string de 20 caracteres e outras vezes de 4 caracteres por exemplo. Nunca ía ficar direito.

Em C não se pode trabalhar muito no aspecto visual...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora