[C] recherche chaine caractère

Bonjour,

comment faire pour rechercher chaine de caractère dans une structure en langage c?

quand il n'y a aucun pays ça fonctionne mais dés que j'en encode un puis que je le recherche, il me dit qu'il n'a pas pu être trouvé.

voici mon code:

short RechercheParNom (struct Pays*p) //par pays

{
	
	int j,i;
	short trouve=0;
	char NomPays[30];
	

	printf("Recherche d'un Pays\n");
	printf("________________________\n\n");

	printf("Entrez le nom a rechecher : ");
	j=LireVChaine(NomPays,30);	
	Majuscule(&NomPays[0]);


	for(j=0;j<30 && trouve==0;j++,i++)
	{
		
		
		if(strcmp(p->NomPays,NomPays)==0)
		{
			trouve=1;
		}
	}


if(j==30 && trouve==0)
		j=0;

	if (trouve==1)
	{
		AffichePays(p);
	}
	else
	{
		printf("\nLe Pays recherche n'a pu etre trouve");
	}
	
	return (j-1);
}
Configuration: Windows XP
Firefox 2.0.0.13

5 réponses

  1. voila ce que je ferai (le pb vient certainement que tu joue avec des tableau non alloué dynamiquement):

    /* dans ta structure :

    char *NomPays; et pas char NomPays[30];

    */

    char s[256];

    scanf("%s",s);//tu saisies le nom du pays

    c->NomPays = (char *)malloc(sizeof(char)*(strlen(s)+1)); //allocation dynamique d'un tableau de char

    strcpy(c->NomPays,s); //copie de s dans c->NomPays

    //et voila cela devrait marcher enfin j'en suis quasi sur
    // ensuite fais un strcmp et ok qd le resultat est à 0.

    bon courage pour la suite
    0
    1. comment tu rentres les pays dans la structure avant la recherche ?
      0
      1. pourquoi ne pas utilisé un bon vieux scanf("%s",p) ? et tes chaine ne sont pas de meme taille une est à 20 et une autre est à 30, pb de cohérence
        0
        1. j'ai modifier pour les tailles et j'ai essayer avec scanf mais il me dit qu'il ne trouve pas bien que j'ai encodé précemment, il doit y avoir une erreur mas je ne trouve pas...
          0
      2. peux-tu me donner la structure Pays ainsi que les fonctions affichepays et lireVchaine stp, merci
        0
        1. Oui bien sûr, les voici:

          struct Pays{
          	intNumPays;
          	char   NomPays[20];
                   int   NombreHab;
          	
          };
          
          int LireVChaine (char *p,short nb)
          {
          	int i=0;
          	char *g;
          
          	fflush(stdin);
          
          	g=p;
          
          	do
          	{
          		*g=getchar();
          		i++;
          		g++;
          	}while (*(g-1)!='\n' && i < nb);
          	*(g-1)='\0';
          	
          	Majuscule(p);
          	
          
          	return (i);
          }
          
          void AffichePays(struct Pays*p)
          
          {
          	system("cls");
          	printf("\n%d",p->NumPays);
          	printf("%s",->NomPays);
          	printf("%d",->NombreHab);
          }


          merci
          0
        2. @joanacorrection

          struct Pays{
          int NumPays;
          char NomPays[20];
          int NombreHab;

          };


          int LireVChaine (char *p,short nb)
          {
          int i=0;
          char *g;

          fflush(stdin);

          g=p;

          do
          {
          *g=getchar();
          i++;
          g++;
          }while (*(g-1)!='\n' && i < nb);
          *(g-1)='\0';

          Majuscule(p);

          return (i);
          }

          void AffichePays(struct Pays*p)

          {
          system("cls");
          printf("\n%d",p->NumPays);
          printf("%s",p->NomPays);
          printf("%d",p->NombreHab);
          }
          0
      3. dans :

        for(j=0;j<30 && trouve==0;j++,i++)
        {

        if(strcmp(p->NomPays,NomPays)==0)
        {
        trouve=1;
        }
        }

        a quoi servent tes indices ? ou plutot a quoi sert cette boucle ?

        un strcmp ne suffit-il pas ? entre p->NomPays et NomPays ?

        strcmp compare deux chaine donc je ne vois l'utilité de ta boucle.

        0
        1. bonjour,

          j'avais essayer sans boucle aussi et ça donne le même résultat, il ne trouve pas le pays malgré qu'il y en a d'encoder.
          il y a surement une erreur mais je n'arrive pas à la trouver...

          short RechercheParNom (struct Pays*p) //par pays
          
          {
          	
          	int j,i;
          	short trouve=0;
          	char NomPays[30];
          	
          
          	printf("Recherche d'un Pays\n");
          	printf("________________________\n\n");
          
          	printf("Entrez le nom a rechecher : ");
          	j=LireVChaine(NomPays,30);	
          	Majuscule(&NomPays[0]);
          
          
          	
          		
          		
          		if(strcmp(p->NomPays,NomPays)==0)
          		{
          			trouve=1;
          		}
                    
                  if(j==30 && trouve==0)
          		j=0;
          
          	if (trouve==1)
          	{
          		AffichePays(p);
          	}
          	else
          	{
          		printf("\nLe Pays recherche n'a pu etre trouve");
          	}
          	
          	return (j-1);
          }
          0