Bonjour,
Pour commencer, ton intention est-elle de refaire ce TP avec les mêmes restrictions qu'à l'époque ?
En particulier au niveau des fonctions de la bibliothèque standard utilisables ou pas.
Parce que si non, il y a largement moyen d'améliorer le code...
Quoiqu'il en soit, le problème vient de la boucle while.
Excuse-moi de le dire comme ça, mais elle est complètement foireuse...
As-tu une idée du nombre de lignes lues dans une seule itération ?
Je ne serais pas étonné que dans pas mal de cas, l'entrée standard soit complètement lue dès la première itération... 
Il faut savoir que, à moins de savoir exactement ce que l'on fait, c'est une mauvaise idée d'appeler une fonction avec des effets de bord dans la condition d'une boucle.
Dans le meilleur des cas, les conséquences sont négligeables, voire ça fait ce que l'on veut ; dans le pire des cas, cela rend le programme incohérent.
Lorsque tu appelles readl, tu lis une ligne de l'entrée standard, et par conséquent tu déplaces le curseur interne (le fameux effet de bord) ; de plus, tu modifies de contenu des données pointées par ligne.
Lors d'un appel suivant, l'état de l'entrée standard a changé, et tu ne peux espérer obtenir le même résultat que précédemment.
Pour en revenir aux boucles, tu dois savoir que la condition est évaluée à chaque itération.
Alors si tu appelles readl dans la condition, elle sera exécutée à chaque itération, et comme je le disais juste au-dessus, aura un résultat potentiellement différent.
Autrement dit, à chaque itération, une nouvelle ligne est lue depuis l'entrée standard (et donc le curseur interne est déplacé), le contenu de la chaîne ligne est modifié, et une valeur a priori différente est retournée.
Tu commences à voir ce qui pose problème ?
Décortiquons un peu ton code...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| while(readl(ligne)!= EOF){ /* La première ligne de l'entrée standard est lue,
* ligne contient la première ligne,
* la longueur de la première ligne est retournée.
*/
for(index=0; index<(readl(ligne)); ++index){ /* La deuxième ligne est lue à l'entrée dans la boucle,
* ligne contient la deuxième ligne,
* la longueur de la deuxième ligne est retournée.
* À chaque itération suivante, la ligne suivante est lue,
* ligne contient cette ligne,
* la longueur de cette ligne est retournée.
*/
(...)
for(i=0; i<(readl(ligne)); ++i){ /* À l'entrée dans la boucle, et pour chaque itération, la ligne suivant la ligne courante est lue,
* ligne contient cette ligne,
* la longueur de cette ligne est retournée.
*/
(...)
}
}
} |
Toi qui t'attends à obtenir la même valeur pour toutes les itérations des boucles for... 
Il faut que tu t'assures de ne lire qu'une seule ligne par itération de la boucle [codeninline]while[/codeinline].
Autrement dit, il faut que la fonction readl ne soit appelée qu'une fois par itération.
Et pour cela, tu n'as pas le choix : utilise des variables auxiliaires (ligne en est déjà une
).
Une fois que tu auras résolu ce problème, tu te heurteras à un autre.
Hé oui, désolé... 
Ta façon de détecter qu'un mot est bien présent dans une ligne n'est pas bonne.
En réalité, tu testes si tous les caractères du mot recherché apparaissent dans la ligne courante, et dans le même ordre.
Par exemple, ton programme (corrigé) trouverait que le mot « toto » apparaît dans la ligne suivante :
Nous allons tous ensemble fêter Noël !
Bon courage.
Partager