Menu

Recherche d'erreurs dans un fichier HTML avec C

- - Dernière réponse : [Dal]
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
- 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
Afficher la suite 

3 réponses

Messages postés
8085
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 juillet 2019
398
0
Merci
bonjour, n'as-tu pas été formé pour réaliser cela? comment cela peut-il te dépasser? de quelle formation s'agit-il?
MHIKAWOLFAK-47
Messages postés
5
Date d'inscription
dimanche 16 juin 2019
Statut
Membre
Dernière intervention
21 juin 2019
-
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 !
Commenter la réponse de yg_be
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
786
0
Merci
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
[Dal]
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
786 -
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.
[Dal]
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
786 -
retires ce nom de la liste mentionnée en d-

je voulais dire "mentionnée en c-"
MHIKAWOLFAK-47
Messages postés
5
Date d'inscription
dimanche 16 juin 2019
Statut
Membre
Dernière intervention
21 juin 2019
-
Et comment est-ce que je peut lire chaque caractère du fichier !
Éclaire un peu çà avec du code!
yg_be
Messages postés
8085
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 juillet 2019
398 > MHIKAWOLFAK-47
Messages postés
5
Date d'inscription
dimanche 16 juin 2019
Statut
Membre
Dernière intervention
21 juin 2019
-
si nous faisons l’exercice à ta place, cela ne te permettra pas de progresser, et encore moins de te surpasser.
[Dal]
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
786 -
Et comment est-ce que je peut lire chaque caractère du fichier !
Éclaire un peu çà avec du code!


Merci pour cette réponse avenante à la mienne, que j'ai passé un peu de temps à rédiger dans le but de te guider.

- tu peux le faire de multiples façons, une des façons est d'utiliser
fgetc()
, c'est la plus simple, même si ce n'est pas toujours la plus efficace
- tu as la documentation de cette fonction et des exemples de code l'utilisant ici : http://www.cplusplus.com/reference/cstdio/fgetc/ ou dans tout autre site de référence ou ouvrage de référence que tu ferais l'effort de rechercher par toi même

C'est bizarre que tu saches ouvrir un fichier, selon tes affirmations, mais pas en lire le contenu.

Quoi qu'il en soit, il est facile de trouver l'information, comme tu le vois, pour peu que tu cherches.

Autrement, yg_be a raison, et j'ajouterai aussi qu'on ne peut pas apprendre le C à ta place, c'est ton travail.

Montre nous, toi, ton code si tu as des problèmes à le mettre au point. Des contributeurs du forum disposant du temps, de la motivation et des compétences de fournir un service bénévole à une personne de bonne volonté se manifestent en général.

Bonne chance pour ton projet.

_______
Note importante : lorsque tu postes du code C sur le forum, fais le avec les balises "code c", afin que ton code soit correctement affiché par le forum, avec préservation de l'indentation, coloration syntaxique et numérotation des lignes.

<code c>
copie-colle ton code entre deux ces deux balises
</code>

Si tu ne veux pas taper les balises, tu les insères aussi en cliquant sur la flèche qui pointe vers le bas à gauche du bouton du forum servant à poster des images, et en choissant le langage "c", et tu n'as plus ensuite qu'à copier-coller ton code entre les deux balises, comme dans l'exemple ci-dessus.
Commenter la réponse de [Dal]
Messages postés
5
Date d'inscription
dimanche 16 juin 2019
Statut
Membre
Dernière intervention
21 juin 2019
0
Merci
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);
    }

-
Non, la fonction strstr ne marche pas tellement !
Pierrecastor
Messages postés
35083
Date d'inscription
mercredi 5 novembre 2003
Statut
Modérateur
Dernière intervention
21 juillet 2019
2971 > MHIKAWOLFAK-47 -
Salut,

Les balises marchent très bien par contre. Mais il faut s'en servir. Tu peux éditer ton message avec l’icône du petit crayon pour rajouter les balises C.
-
J'arrive à détecter les balises mais j'essaie de vérifier si elles existent dans un autre fichier avec la fonction strstr ça le fait pas!
Pierrecastor
Messages postés
35083
Date d'inscription
mercredi 5 novembre 2003
Statut
Modérateur
Dernière intervention
21 juillet 2019
2971 -
Les balises du forum, ici ! Pour que l'on puisse lire ton code sans se crever les yeux.

Comme l’expliquait [dal] dans ce message

La balise de fin, c'est </code> et non </code c>

Il faut que tu recolle ton code avec les connes balises.
[Dal]
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
786 -
Salut MHIKAWOLFAK-47,

Tu poses une autre question, qui n'a rien à voir celle que tu as initialement posée dans ce fil de discussion. Dans ce cas, tu dois créer une nouveau fil de discussion pour poser une nouvelle question.

Fais cela, s'il te plaît, et veille à poster correctement ton code.

Ensuite, le code que tu as posté ne compile pas, et donc tu ne risques pas de pouvoir l'exécuter.

$ gcc -Wall 36078402.c 
36078402.c: In function ‘main’:
36078402.c:9:18: error: ‘ligneF’ undeclared (first use in this function)
  char LF1 =fgets(ligneF,sizeof ligneF,file1);
                  ^~~~~~
36078402.c:9:18: note: each undeclared identifier is reported only once for each function it appears in
36078402.c:11:19: error: ‘ligneB’ undeclared (first use in this function)
  char LF2 = fgets(ligneB,sizeof ligneB,file2);
                   ^~~~~~
36078402.c:13:11: warning: comparison between pointer and integer
  while(LF1!=NULL && LF2 !=NULL)
           ^~
36078402.c:13:25: warning: comparison between pointer and integer
  while(LF1!=NULL && LF2 !=NULL)
                         ^~
36078402.c:15:14: warning: implicit declaration of function ‘strstr’ [-Wimplicit-function-declaration]
   char verif=strstr(LF2,LF2);
              ^~~~~~
36078402.c:15:14: warning: incompatible implicit declaration of built-in function ‘strstr’
36078402.c:15:14: note: include ‘<string.h>’ or provide a declaration of ‘strstr’
36078402.c:15:21: warning: passing argument 1 of ‘strstr’ makes pointer from integer without a cast [-Wint-conversion]
   char verif=strstr(LF2,LF2);
                     ^~~
36078402.c:15:21: note: expected ‘const char *’ but argument is of type ‘char’
36078402.c:15:25: warning: passing argument 2 of ‘strstr’ makes pointer from integer without a cast [-Wint-conversion]
   char verif=strstr(LF2,LF2);
                         ^~~
36078402.c:15:25: note: expected ‘const char *’ but argument is of type ‘char’
36078402.c:15:14: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   char verif=strstr(LF2,LF2);
              ^~~~~~
36078402.c:16:11: warning: comparison between pointer and integer
   if(verif!=NULL)
           ^~
36078402.c:18:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
    printf("%s",verif);

Tu devrais utiliser les messages d'erreur et avertissements produits par le compilateur pour corriger ton code. Tu apprendras beaucoup en cherchant par toi même pourquoi ces erreurs et avertissements sont signalés et en les corrigeant.

Lorsque tu auras corrigé ton code, poste le sur le forum (dans un nouveau fil) si tu as toujours des problèmes, et si tu n'arrives pas à comprendre certains messages d'erreur ou avertissements en dépit de tes efforts, pose la question sur le nouveau fil que tu créeras.

Dal
Commenter la réponse de MHIKAWOLFAK-47