Problème : Mon prog ne marche pas.
VOici un programme qui lit le code source d'une page web, et est sensé repérer une balise annonçant un lien.
Il ne marche pas. Quelqu'un peut il me dire pourquoi.
Configuration: Windows XP Firefox 3.0.3
26 réponses
La discussion porte sur un programme qui télécharge le code source d'une page web et cherche une sous-chaîne entre les balises
-
En fait je ne comprends pas pourquoi tu as deux programmes. J'ai déjà fait plusieurs programmes utilisant libcurl (entre autre pour exploiter dans mes programmes des résultats des recherches sur google).
Il suffit d'une fonction qui te télécharge le code source de la page et qui te l'écrit dans un char*.
Après tu n'as qu'à parcourir ce char* dans ta main (ou dans une autre fonction appelée depuis la main).
Je ne voudrais pas que tu te décourages mais ta "while if while if", pour ma part je la trouve tellement laide que je n'ai pas envie de me pencher à fond dessus, résultat : je ne la comprends pas. Il ne faut pas oublier qu'un bon code est un code bien structuré et facilement "reprenable", et éventuellement commenté (mais ce n'est pas parce qu'on commente qu'il faut pour autant se permettre de faire du code moche).size_t ecrire(void *ptr, size_t size, size_t nmemb, void *stream) { sprintf(stream, "%s%s", stream, ptr); //concatène stream et str dans stream return nmemb; } void dlwebsite(char *url, char *source) { CURL *session; CURLcode res; source[0] = '\0'; //initialisation source vide session = curl_easy_init(); curl_easy_setopt(session, CURLOPT_URL, url); curl_easy_setopt(session, CURLOPT_WRITEDATA, source); curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, ecrire); curl_easy_perform(session); curl_easy_cleanup(session); } void analyse(char *source) //éventuellement d'autres entrées { ... je te laisse le soin d'y mettre le contenu si tu prends en considération ma présentation de code } int main() { char *url = "https://www.google.com/?gws_rd=ssl"; char *source = malloc(500000); dlwebsite(url, source); analyse(source); }
et pas besoin de variables globales !
Un autre avantage d'avoir un code bien structuré en fonction est que, même quelqu'un qui n'aurait pas cette librairie pourrait se faire une petite main vite fait pour tester ta fonction sans dépendre du reste de ton code (sans avoir à faire le tri..). -
ben j'ai pas encore eu a utiliser le C sur des page web c'est pour ça ;)
mais essaye et tu verras bien ça change quelquechose -
Aïe !
tu ne devrais pas sortir à poil !:) -
je peux pas tester ton programme j'ai pas la lib ;)
-
POUrquoi je modifie ?
ha la la :)
Si je le savais. Je pense que si je remplace chaine par buffer,
-chaine représente la chaine de caractère total dans le programe 2
-buffer représente l'espace mémoire alloué à la lecture des 50 000 caractère.
Donc je me suis dit qu'il fallait que ces deux variable n'en soit qu'une dans le programme.
Mais peut être que je ne devrait pas. TU as essayé sans modifier? -
moi je comprend pas pourquoi tu modifie ton programme dans cette partie...
while ( u < strlen( chaine ) && ok == 0 ) { // Si on trouve debut dans la chaine saisie if ( strncmp( &chaine[u], debut, taille ) == 0 ) { u = u + taille; taille = strlen( fin ); // On cherche maintenant la chaine fin while ( u < strlen( chaine ) ) { sous_chaine[indice] = chaine[u]; // Si on trouve la chaine fin... if ( strncmp( &chaine[u], fin, taille ) == 0 ) { // ...on enregistre l'indice sous_chaine[indice] = '\0'; // ...on sort ok = 1; break;
la tu fais bien des strncmp( &chaine[u], fin, taille ) mais dans ton code final quand tu mixe les deux programme tu fais strncmp( buffer[50000], fin, taille ) pourquoi enlevé le & ? -
Bon ok,
mais je te l'ai pourtant envoyé !!!
tu ne l'a pas recu ?
Bon voilà le PRG N°1 : connection_lecture d'un code source d'un page web :
#include <windows.h> #include <stdlib.h> #include <curl/curl.h> #include <stdio.h> //Variables globales char buffer[4096]; int offset = 0; /*là c'est la définition de la fontion buffer_write pour allouer la bonne taille au buffer*/ size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { int i; char *myptr = (char *) ptr; for (i=0; i < size * nmemb; i++) { if (i + offset >= sizeof(buffer)) break; buffer[i + offset] = myptr[i]; offset++; } return size * nmemb; } /*là c'est l'ouverture de la séssion vers l'url, et la lecture grâce à la fonction buffer_write*/ int main(int argc, char **argv) { char url[1024]; int i; scanf("%s", &url); /*là on indique l'url de la page qu'on veut lire/* CURL *session = curl_easy_init(); /*Initialisation de la session */ curl_easy_setopt(session, CURLOPT_URL, url); /*Ici on précise l'url */ curl_easy_setopt(session, CURLOPT_WRITEDATA, stdout); //On fait semblant d'avoir un fichier curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, &buffer_write); //On passe notre fonction curl_easy_perform(session); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ for (i=0; i<offset; i++) printf("%c", buffer[i]); getchar(); return 0; }
-------------------------------------------------------------------------------------------------------------------------------------------------------
Et maintenant le PRG N°2 : recherche de la sous chaine située entre les balises "<titre>" et "<\titre>"
-------------------------------------------------------------------------------------------------------------------------------------------------------#include <windows.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int y; const int TAILLE_CHAINE_MAX = 555; char * debut = "<titre>"; char * fin = "<\titre>"; char chaine[TAILLE_CHAINE_MAX]; chaine[0] = -1; chaine[TAILLE_CHAINE_MAX-1] = '\0'; char sous_chaine[TAILLE_CHAINE_MAX]; int u = 0; int indice = 0; int taille = strlen( debut ); int ok = 0; printf( "Ce programme trouve une sous-chaine comprise entre les chaines %s et %s.\n\n", debut, fin ); printf( "Ecrivez un texte de la forme : \n[...] %s [...] %s [...] (Maximum %i caracteres)\n", debut, fin, TAILLE_CHAINE_MAX ); // Tant que le caractère saisi n'est pas un saut de ligne et qu'on n'a pas atteint // le nombre de caractères maximum, on lit et on enregistre dans le tableau. scanf("%c", &chaine[u]); while ( chaine[u] != '\n' && u<TAILLE_CHAINE_MAX-1 ) { ++u; scanf("%c", &chaine[u]); } if ( u < TAILLE_CHAINE_MAX-1 ) { chaine[u] = '\0'; } u = 0; while ( u < strlen( chaine ) && ok == 0 ) { // Si on trouve debut dans la chaine saisie if ( strncmp( &chaine[u], debut, taille ) == 0 ) { u = u + taille; taille = strlen( fin ); // On cherche maintenant la chaine fin while ( u < strlen( chaine ) ) { sous_chaine[indice] = chaine[u]; // Si on trouve la chaine fin... if ( strncmp( &chaine[u], fin, taille ) == 0 ) { // ...on enregistre l'indice sous_chaine[indice] = '\0'; // ...on sort ok = 1; break; } ++u; ++indice; } } ++u; } if ( ok == 1 ) printf( "La sous-chaine trouvee est : '%s'.\n", sous_chaine ); else printf( "Aucune sous-chaine trouvee.\n" ); scanf ( "%c", &y); return 0; }
-------------------------------------------------------------------------------------------------------------------------------------------------------
Voilà tu as les deux programme. essaies les séparément, ils marcheront. Mais mon objectif; c'est deux faire en sorte que aprés avoir rentrer une URL , le programme final se lance cherche et m'affiche la chaine de caractère comprise entre les balises <titre> et <\titre>. -
Je pige pas comment elle marche la page que tu m'envoies ! :)
il me faut ton adresse non ?
c'estpas plus simple si je te poste les deux pregramme séparemment ?-
Tu cliques juste sur parcourir pour indiquer le fichier et c'est tout .. tu cliques sur le bouton Créer le lien Cjoint
edit : c'est plus simple ouais mais ça ne va rien faire d'autre qu'allonger le sujet encore une fois pour du code quasiment similaire à tous les autres. Et puis c'est plus fiable d'avoir le fichier, plutôt qu'un copier coller (on ne sait jamais des fois que tu collerais pas le bon sans t'en apercevoir ou jsais pas quoi...) -
-
-
Bon me revoilà.
non, je crois que vous n'avez pas vraiment compris comment ce programme a été construit, et c'est pour ça que vous avez du mal à "entrer" conceptuellement dans les variables.
le mieux, c'est que je vous passe les programme détaillé l'un aprés l'autre.
Ils sont assez simple à comprendre et ne font qu'une 15 n de lignes.
Quest ce que vous en pensez ?
(parce que j'ai fait vos modification, et elles m'ont amené à d'autres, et au bout du compte plus rien ne fonctionnait.)-
c'est ce que je disais dans un de mes messages précédents
Pourrais-tu joindre ton fichier .c qui pose problème là : https://www.cjoint.com/ et me transmettre le lien pour que je vois ça ?
-
-
Bon, il s'est passé plusieurs truc.
ne bougez pas je vais chercher mon clébar qui s'est encore faufilé sous le grillage !
J'ne ai pour aproximativement 20 minutes -
maintenant que je remplace 'int u=0' par 'u=0', le compilateur s'arrête à cette ligne :
if ( strncmp( buffer[50000], debut, taille ) == 0 ) {
il indique encore
'in function main' -
JE te remet le code sur la page de discussion, tel quel. Tu n'as qu'a le copier et le coller. (Mais je te l'avais déjà mis dès la seconde reponse). tiens. le voici texto ( je ne sais pas comment me servir de la page que tu as envoyé)
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <curl/curl.h> //Variables globales char buffer[50000]; int offset = 0; /*là c'est la définition de la fontion buffer_write pour allouer la bonne taille au buffer*/ size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { int i; char *myptr = (char *) ptr; for (i=0; i < size * nmemb; i++) { if (i + offset >= sizeof(buffer)) break; buffer[i + offset] = myptr[i]; offset++; } return size * nmemb; } int main(int argc, char *argv[]) { char url[1024]; int u; int y; const int TAILLE_CHAINE_MAX = 50000; char * debut = "<a href=\""; char * fin = "\""; char buffer[TAILLE_CHAINE_MAX]; char sous_chaine[TAILLE_CHAINE_MAX]; int u = 0; int indice = 0; int taille = strlen( debut ); int ok = 0; buffer[50000] = -1; buffer[TAILLE_CHAINE_MAX-1] = '\0'; scanf("%s", &url); CURL *session = curl_easy_init(); /*Initialisation de la session */ curl_easy_setopt(session, CURLOPT_URL, url); /*Ici on précise l'url */ curl_easy_setopt(session, CURLOPT_WRITEDATA, stdout); //On fait semblant d'avoir un fichier curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, &buffer_write); //On passe notre fonction curl_easy_perform(session); printf( "Ce programme trouve une sous-chaine comprise entre les chaines %s et %s.\n\n", debut, fin ); printf( "Ecrivez un texte de la forme : \n[...] %s [...] %s [...] (Maximum %i caracteres)\n", debut, fin, TAILLE_CHAINE_MAX ); // Tant que le caractère saisi n'est pas un saut de ligne et qu'on n'a pas atteint // le nombre de caractères maximum, on lit et on enregistre dans le tableau. while ( buffer[50000] != '\n' && u<TAILLE_CHAINE_MAX-1 ) { ++u; scanf("%c", &buffer[50000]); } if ( u < TAILLE_CHAINE_MAX-1 ) { buffer[50000] = '\0'; } u = 0; while ( u < strlen( buffer ) && ok == 0 ) { // Si on trouve debut dans la chaine saisie if ( strncmp( buffer[50000], debut, taille ) == 0 ) { u = u + taille; taille = strlen( fin ); // On cherche maintenant la chaine fin while ( u < strlen( buffer ) ) { sous_chaine[indice] = buffer[50000]; // Si on trouve la chaine fin... if ( strncmp( buffer[50000], fin, taille ) == 0 ) { // ...on enregistre l'indice sous_chaine[indice] = '\0'; // ...on sort ok = 1; break; } ++u; ++indice; } } ++u; } if ( ok == 1 ) for (u=0; u<offset; u++) printf("%c", buffer[u]); printf( "La sous-chaine trouvee est : '%s'.\n", sous_chaine ); else printf( "Aucune sous-chaine trouvee.\n" ); scanf ( "%c", &y); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ return 0; } -
ça doit etre parce que tu declare deux fois u...
int main(int argc, char *argv[]) { char url[1024]; int u; // <-----------------------ICI int y; const int TAILLE_CHAINE_MAX = 55555; char * debut = "<a href=\""; char * fin = "\""; char buffer[TAILLE_CHAINE_MAX]; buffer[50000] = -1; buffer[TAILLE_CHAINE_MAX-1] = '\0'; char sous_chaine[TAILLE_CHAINE_MAX]; int u = 0; // <----------------------------- et LA int indice = 0; int taille = strlen( debut ); int ok = 0;
le deuxieme ça serait plutot u=0 je pense-
-
@Utilisateur anonymeoui ça depend du compilo ;)
-
-
J'ai la version 4.9.9.2 de dev ++
-
non c'est plutôt l'inverse je veux dire, j'ai changé tou les i en u pour la fonction qui reconnait la sous chaine.
une fois encore sir tu essaye les deux programme séparément il marchent. Mais c'est dans la version où je les ai mis dans la même feuille de code que ça ne marche pas.-
olala je crains le pire ... aurais-tu 2 fonctions main() dans ton fichier .c ?
Pourrais-tu joindre ton fichier .c qui pose problème là : https://www.cjoint.com/ et me transmettre le lien pour que je vois ça ?
-
-
En fait( une précision), je ne sias pas si tu as remarqué, mais dans la version complète, j'ai remplacé tout les i par des u (istoire qu'il n'y ai aucune confusion de variable, cela ne concerne évidemnt que les i du prog servant la création du buffer.
Et bien le compilo (il s'agit de dev ++) ne dit que :
in function main
lorsqu'il s'arrête à la ligne:
int u = 0;-
J'utilise Dev-c++ (et Visual Studio 2005 Édition Professionnelle lorsque je dois débugger).
Dev-c++ ne me donne pas d'erreur de mon côté, tu dois avoir des options de compilations différentes des miennes. Lorsque le compilo s'arrête à une ligne il dit l'erreur (en anglais). C'est avec l'erreur qu'on trouve, pas avec la ligne simplement (sauf dans les cas d'erreurs bêtes).
Dis-moi ce qu'il te dit dans la colonne "Message" à l'arrêt à la ligne int u = 0;
-
-
Non, ça ne fait rien.
ça bloque toujours à la même ligne -
OK merci !
ça y 'est je les vois !
Donc ces deux lignes en gras je devrais les mettre où exactement ?
et puis si tu n'y vois pas d'inconvenient je crois que je vais arrêter la pour aujourd'hui.
tu es présent sur le forum demain ? -
dans quels programme tu regardes ?
J'ai beau me crever les yeux ( :) ) je ne trouve pas les deux bout de code que tu m'a signalé ?
Es tu sûr que tu regardes dans la première version ( la version totale que j'ai envoyé des mon second message) ? -
En fait je n'arrive même pas à tester puisque le compilo s'arrête à la ligne :
int u = 0;
le prg ne se lance tout simplement pas.
- 1
- 2