Recherche d'erreurs dans un fichier HTML avec C

Fermé
MHIKAWOLFAK-47 - 16 juin 2019 à 19:13
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 2 juil. 2019 à 13:36
Bonjour,

J'ai un projet de la fac, on nous demande d'ouvrir un fichier HTML et détecter les fautes d'orthographe de tous les balises utilisée​s dans​ ce fichier, détecter l'omission ou l'oubli des balises fermantes ou ouvrantes.
Ouvrir un fichier je connais mais les opérations ça me dépasse !

Svp, aidez-moi ?

Configuration: Android / Chrome 56.0.2924.87
A voir également:

3 réponses

yg_be Messages postés 22723 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
16 juin 2019 à 21:05
bonjour, n'as-tu pas été formé pour réaliser cela? comment cela peut-il te dépasser? de quelle formation s'agit-il?
0
MHIKAWOLFAK-47 Messages postés 5 Date d'inscription dimanche 16 juin 2019 Statut Membre Dernière intervention 21 juin 2019
17 juin 2019 à 15:38
Cela me dépasse parceque dans le cours de langage C , nous ne sommes pas encore arrivé à ce niveau, mais on nous demande de se surpasser !

Si tu veux m'aider alors n'hésite pas !
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 17 juin 2019 à 13:49
Salut MHIKAWOLFAK,

De la façon dont tu as formulé le sujet de l'exercice on peut comprendre de multiples choses. Si tu dois vérifier que la syntaxe d'un document HTML est valide, alors tu as beaucoup de travail car cela suppose que ton programme implémente toute la syntaxe du standard HTML, avec tous les tags html existants, leur syntaxe propre,...

Il y a des bibliothèque qui font cela, elles ne sont pas triviales et les réaliser dans le cadre d'un exercice me semble démesuré (à moins qu'on te demande juste de les utiliser) :

https://www.html-tidy.org/

Si ton exercice est beaucoup plus limité que ton message ne le laisse penser et, par exemple, se limite à vérifier qu'une balise ouvrante dans le code HTML contient une balise fermante, que cette balise existe ou non dans le standard, ou quelque soit le contenu de la balise, et sans que tu aies à vérifier si une balise peut en contenir une autre ou peut se chevaucher avec une autre, que ce n'est pas très compliqué.

Cela doit être indiqué par ton énoncé. La première chose est de bien comprendre celui-ci et tu auras déjà fait une partie importante de ton travail, et si ton énoncé n'est pas suffisamment précis, demande des précisions à ton enseignant.

Dal
0
MHIKAWOLFAK-47 Messages postés 5 Date d'inscription dimanche 16 juin 2019 Statut Membre Dernière intervention 21 juin 2019
17 juin 2019 à 15:46
Je sais comment ouvrir un fichier HTML avec C, mais savoir si une certaine portion de texte est une balise ou pas, c'est ce qui me manque !
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 17 juin 2019 à 16:25
une balise ouvrante est du texte entre chevrons.

à partir de là :

-
<dutexte>
serait une balise ouvrante de
-
</dutexte>
qui en serait la balise fermante correspondante

(c'est une balise inventée, qui n'existe pas en HTML)

Si tu n'as pas à vérifier si la balise existe en HTML, un exemple de procédure simpliste serait de :

a- parcourir le contenu en texte du fichier
b- lorsque tu trouves un chevron
'<'
de noter que tu as une nouvelle balise
c- parcourir la suite jusqu'au prochain
'>'
en notant les caractères entre les deux qui formeront le nom de ta balise, que tu peux mémoriser dans une structure de données (par un exemple un tableau de chaînes, une liste chaînée,...) et en arrêtant le nom de la balise au premier espace ou caractère blanc trouvé pour le cas où la balise HTML a des attributs (par exemple
<a href="https://www.commentcamarche.net">Visitez www.commentcamarche.net !</a>
) : ici la balise est en réalité
<a>
...
d- lorsque tu trouves une chaîne
"</"
parcourir la suite jusqu'au prochain
'>'
en notant les caractères entre les deux qui formeront le nom de ta balise fermante. Une fois que tu dispose du nom de la balise fermante, tu retires ce nom de la liste mentionnée en d- en commençant par la fin de la liste, s'il s'y trouve

tu peux aussi vérifier qu'une balise fermante ne se trouve pas au milieu d'une balise ouvrante, et inversement, et qu'une fois un chevron
'<'
ou
"</"
est trouvé, que tu as bien un chevron
'>'
qui le termine ...

tu peux aussi noter les numéros de ligne où se trouvent les balises pour donner des messages d'erreur y faisant référence, etc.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
18 juin 2019 à 09:00
retires ce nom de la liste mentionnée en d-

je voulais dire "mentionnée en c-"
0
MHIKAWOLFAK-47 Messages postés 5 Date d'inscription dimanche 16 juin 2019 Statut Membre Dernière intervention 21 juin 2019
19 juin 2019 à 11:30
Et comment est-ce que je peut lire chaque caractère du fichier !
Éclaire un peu çà avec du code!
0
yg_be Messages postés 22723 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > MHIKAWOLFAK-47 Messages postés 5 Date d'inscription dimanche 16 juin 2019 Statut Membre Dernière intervention 21 juin 2019
19 juin 2019 à 12:32
si nous faisons l’exercice à ta place, cela ne te permettra pas de progresser, et encore moins de te surpasser.
0
MHIKAWOLFAK-47 Messages postés 5 Date d'inscription dimanche 16 juin 2019 Statut Membre Dernière intervention 21 juin 2019
19 juin 2019 à 14:17
Voici le code que j'ai taper, il est sensé compter le nombre des balises mais je crois qu'il y a des erreurs !



#include<stdio.h>
#include<stdlib.h>

int main()
{
    static const char filename[128] ;
    printf("Tapez le nom et l'extention de votre fichier : ");
    scanf("%s", &filename);
    FILE *file = fopen(filename, "r");


    if(file!=NULL)
    {
        int balise=0;
        int i=0;
       char line[200];
        fgets(line, sizeof line,file);

           if((line[0] || line[1] || line[2] =='<') && line[1] || line[2] || line[3] !='</'  )
           {

               while(fgets(line, sizeof line, file) != NULL)
               {
                   balise+=1;
                    printf("%s",line);
               }
                  printf("\n");
                  printf("vous avez utiliser %d balises parents et enfants dans ce fichier\n",balise);
           }

       }

       fclose(file);
    }

0
yg_be Messages postés 22723 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
19 juin 2019 à 19:45
as-tu lu la note concernant les balises?
je te suggère de d'abord faire des exercices plus simples pour apprendre les bases du langage. par exemple, compter le nombre de caractères et le nombre de lignes dans un fichier.
0
MHIKAWOLFAK-47 Messages postés 5 Date d'inscription dimanche 16 juin 2019 Statut Membre Dernière intervention 21 juin 2019
21 juin 2019 à 22:05
Je vais essayer les gars, ne me laisser pas tomber !
J'ai vraiment envie de réaliser ce projet !
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 24 juin 2019 à 10:32
Relis mon message attentivement pour poster ton code correctement sur le forum la prochaine fois. Là, il est quasiment illisible car tu n'as pas indiqué le langage c dans la balise de code du forum (tu as utilisé une balise <code> et non pas une balise <code c>).

Ensuite, tu n'as pas non plus suivi mes indications sur le descriptif d'un algorithme simple, ni celle sur la fonction standard C de lecture la plus simple que tu pourrais utiliser. Ce n'est pas le plus grave, car tu as le droit de te compliquer la vie, et, de toutes façons, il n'y a pas qu'une seule façon de faire (et, en plus, tu fais, en fin de compte quelque chose de différent par rapport à ce que tu disais au début, puisque tu ne cherches plus des "erreurs", mais, désormais, tu comptes les balises) et toi au d'autres pourront trouver de meilleures manières :-)

Sur ton code.

Sur le plan de la syntaxe ce que tu compares dans ton if ne fait sans doutes pas ce que tu penses.

En C,
(line[0] || line[1] || line[2] =='<')
signifie, pour le compilateur C :

- si
line[0]
est évalué à vrai (ce qui sera le cas si
line[0]
contient autre chose que
'\0'
...
- ou si
line[1]
est évalué à vrai (même remarque)
- ou si si
line[2]
est égal au caractère littéral
'<'
...

Dans la comparaison qui suit les
&&
, comme tu ne mets pas de parenthèses, le
&&
ne sera appliqué qu'à l'opérande suivante.

Ce qui suit dans la comparaison a les mêmes problèmes que ceux déjà expliqués. Avec le problème supplémentaire
line[3] !='</'
qui doit t'être signalé en avertissement par ton compilateur, puisque tu mets deux caractères littéraux entre apostrophes, ce qui n'a pas de sens.

Il a dû te signaler aussi que tu définissais
filename
comme une
const
alors que tu en modifies le contenu avec
scanf()
.

Utilise les messages d'avertissements du compilateur (avec le compilateur
gcc
, vérifie que l'option de compilation
-Wall
, qui signifie "Warnings all", est bien utilisée) pour t'aider à corriger ton code.

Sur le plan de l'algorithme, si on devine ce que tu essayes de faire, ton raisonnement est faux. Les balises HTML peuvent se trouver n'importe où sur une ligne, pas uniquement en début de ligne.

Bonne chance pour la suite.
0
MHIKAWOLFAK-47
1 juil. 2019 à 21:29
Vous m'aider beaucoup, tout d'abord merci pour tout jusque là.
Mais j'ai encore un petit soucis ;
J'aimerais cette fois-ci vérifier si une portion du contenu d'un fichier (HTML) se trouve dans un autre fichier (txt)!
J'ai ouvert les deux fichiers puis j'essaie de le faire avec la fonction strstr de la bibliothèque string.h

Voilà le code;

<code c>
#include<stdio.h>
#include<stdlib.h>

int main()
{
FILE *file1=fopen("priva.html","r");
FILE *file2=fopen("list_balise.txt","r");

char LF1 =fgets(ligneF,sizeof ligneF,file1);

char LF2 = fgets(ligneB,sizeof ligneB,file2);

while(LF1!=NULL && LF2 !=NULL)
{
char verif=strstr(LF2,LF2);
if(verif!=NULL)
{
printf("%s",verif);
printf("\t cette balise est dans la liste");
}

}
return 0;
}

</code c>
0
yg_be Messages postés 22723 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > MHIKAWOLFAK-47
1 juil. 2019 à 23:18
et tout fonctionne comme tu le souhaites?
dommage que tu n'aies pas correctement utilisé les balises de code...
0