noname001
Messages postés21Date d'inscriptiondimanche 15 novembre 2009StatutMembreDernière intervention 1 mai 2010
-
15 nov. 2009 à 12:52
noname001
Messages postés21Date d'inscriptiondimanche 15 novembre 2009StatutMembreDerniè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];}
}
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.
noname001
Messages postés21Date d'inscriptiondimanche 15 novembre 2009StatutMembreDerniè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 ..
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.