Utilisation strcmp avec tableau

noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010 - 15 nov. 2009 à 12:52
noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010 - 16 nov. 2009 à 15:56
Bonjour à tous.

Dans le cadre d'un projet que j'ai à réaliser, je dois manipuler la fonction strcmp de cstring.. En effet, j'essaye de l'utiliser pour comparer une chaîne de caractère d'un vecteur avec chaque ligne d'un tableau.


Pour faire simple, mon tableau L[][] se trouve dans une boucle que je n'ai pas mentionnée et reçoit sur chaque ligne une adresse de site.

Il la reçoie de mon vecteur sauvegarde qui lui contient cette adresse. Seulement, il ne faut pas que la même adresse apparaisse plusieurs fois dans mon tableau L.

J'ai donc créée une bool identique initialisé à false.
Ma boucle d'indice k fait varier la ligne de mon tableau pour la comparer à chaque fois à mon vecteur "sauvegarde".
Si le resultat de comparaison de strcmp = 0, alors ma bool devient true et logiquement il ne devrait pas inscrire le contenu de sauvegarde dans mon tableau L.

Seulement à l'éxécution, evidemment tout s'inscrit dans mon tableau et je retrouve plusieurs fois le même lien ...


D'avance merci pour votre aide qui me sauverait la vie je pense


bool identique=false;
                                           int k=0;
                                           while ( k < MAX_NB_LINK )
                                           { 
                                                 resultat = strcmp(L[k],sauvegarde);
                                                 
                                                 if (resultat ==0)//Si les 2 chaînes sont identiques
                                                 {identique=true;}
                                                 
                                                 k++;
                                                 
                                           }
                                           
                                          
                                              
                                             if (identique == false) // Si il ne retrouve pas la même
                                             {                 //chaîne dans le tableau
                                                         int j=0;
                                                         for(j ; sauvegarde[j]!= ' ' ; j++)
                                                         {L[i][j] = sauvegarde[j];}
                                                                                
                                             }
A voir également:

4 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 nov. 2009 à 13:55
Bienvenue,

Désolé, à vu de nez je ne vois pas le souci.

Cependant, je peux déjà te donner un ou deux conseils :

if (identique == false)

Ca fait code débutant. Identique est un booléen. Autant écrire :
if (! identique)


Le code suivant :

int k=0;
while ( k < MAX_NB_LINK )
{
  ...
  k++;
}


Serait bien plus joli sous la forme d'une boucle for.

D'autre part, si tu as (resultat ==0) (Que tu peux aussi écrire (! resultat) bien que c'est moins grave car c'est un entier), tu n'es pas obligé de continuer la comparaison avec les chaînes suivante. Tu sais que c'est un doublon, tu ne l'écrit pas. Donc il faudrait mettre un break après le identique=true;.

Pour la dernière boucle for, tu peux faire un for(int j = 0; sauvegarde[j]!= ' ' ; j++) plutôt que de déclarer et initialiser j avant la boucle.
0
noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010
15 nov. 2009 à 20:35
Pour être plus complet, j'ouvre une page html et je dois faire une recherche de tous les liens se trouvant dans celle-ci et les copier dans mon tableau L sans y retrouver deux fois le même.

J'ai donc une boucle qui fait une recherche caractère par caractère de la balise et qui stocke l'url dans mon vecteur sauvegarde.. ensuite j'utilise strcmp pour comparer chaque ligne du tableau avec ce vecteur sauvegarde ..

Voici le bout de code s'y rapportant:



while(fichier.get (lettre) )
{ if ( lettre == '
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 nov. 2009 à 09:36
Ah je crois que j'ai trouvé finalement.

strcmp fait une comparaison sur des chaînes à zéro terminal. Toi tu travailles sans zéro terminal. Bilan strcmp va au delà de ce que tu considère comme l'URL et trouve donc des différences.

Donc, lors de la récupération de l'URL, ajoute le zéro.

int y = 0 ;
while (fichier.get (lettre) and lettre != '"')
{
  sauvegarde[y] = lettre;
  y++;
}
sauvegarde[y] = 0;


Ainsi, tu vas aussi pouvoir faire un strcpy, pour recopier la chaîne dans L.

if (!identique) // Si il ne retrouve pas la même
{                 //chaîne dans le tableau
  strcpy(L[i], sauvegarde);


Et finalement, une dernière remarque concernant la robustesse de ton programme. En cas de html invalide, si la fin du fichier est une url incomplète, ton programme va planter car il va essayer de lire au delà de la fin du fichier. Faudrait vérifier avec good.
0
noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010
16 nov. 2009 à 15:56
Un tout grand merci à toi rt15, c'est marche nickel et j'ai réussi à finir mon projet
0
Rejoignez-nous