La condition d'arrêt !

Résolu/Fermé
Ateuf Messages postés 5 Date d'inscription samedi 2 février 2013 Statut Membre Dernière intervention 17 mars 2013 - 2 févr. 2013 à 22:08
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 3 févr. 2013 à 20:49
Salut tout le monde !
j'ai trouvé un problème avec cet exercice !

écrire un programme qui lit une suite des mots, ce programme s'arrête lorsque l'utilisateur tape le mot "fin", et affiche le mot la plus longue (il ne faut pas prendre en compte le mot "fin" ).

voilà mon travail mais ça ne fonctionne pas la condition d'arrêt ! ??

char mot [30][30];
char ch[4]="fin";
int i ;

for (i=0; mot[i]!=ch;i++)
gets (mot[i]);

4 réponses

roptat Messages postés 276 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 26 juillet 2013 77
2 févr. 2013 à 23:03
Attention aux dépassements de tampon (buffer overflow en anglais) ! Tu enregistres des données dans un tableau de taille fixe sans vérifier que tu ne dépasse pas. Cela pourrait être dangereux... Tu devrais utiliser une liste chaînée.
Je ne pense pas que ton programme puisse compiler en plus, car tu fais une comparaison entre un char et un char[4]... autrement dit, tu essaye de comparer un caractère avec 4 caractères, ce qui donne toujours un résultat faux (donc tu as une boucle infinie).
Tu pourrais simplement avoir une variable qui enregistre la taille du mot courant, la taille du mot maximal et une variable qui enregistre l'état de fermeture (0 = rien, 1 = le mot commence par f, 2 = le mot commence par fi ... 4 = le mot est fin et on ferme). La taille du mot courant est initialisé à 0, incrémenté par chaque touche de l'utilisateur et remis à 0 en cas d'espace. Si le mot est alors plus grand que le mot maximal, on enregistre sa taille dans la variable prévue à cet effet.
Ainsi, tu n'as pas besoin d'enregistrer les entrées de l'utilisateur.
Bonne chance.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
2 févr. 2013 à 23:53
car tu fais une comparaison entre un char et un char[4]...
Je ne vois pas où tu vois une comparaison entre un char et un char[4]...
mot[i] est de type mot[30]. On a donc une comparaison entre deux chaînes de caractère. Ca compilera sans problème. Le problème est que ça ne fera pas ce qu'il attend.
Enfin, la solution que tu proposes me paraît compliquée ^^.
0
roptat Messages postés 276 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 26 juillet 2013 77
3 févr. 2013 à 08:05
Bien vu :)
0
leen.net Messages postés 212 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 mai 2014 13
2 févr. 2013 à 23:58
String mot [30][30];
String ch[4]="fin";
int i ;

for (i=0; mot[i].equals(ch)!=0;i++)
gets (mot[i]);
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
3 févr. 2013 à 11:29
String mot [30][30];
String ch[4]="fin";

1/ Ce n'est pas String mais string en C++. Je pense que tu dois confondre avec le Java.
2/ Le string n'existe pas en C. C'est pour ça qu'on utilise une dimension de plus avec les char.
3/ Si t'étais en C++, on aurait mis : string mot[30] et string ch;

for (i=0; mot[i].equals(ch)!=0;i++)
N'existe pas en C++. En C, on utilise strcmp() comme j'ai mis plus haut.

gets (mot[i]);
En C++, on n'utilise pas gets() (d'ailleurs on ne l'utilise même plus en C car obsolète). Il y a des fonctions bien plus adaptées. Ici en C++, on aurait simplement utilisé cin >>. Le '\n' n'aurait ainsi pas été stocké.
0
leen.net Messages postés 212 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 mai 2014 13
3 févr. 2013 à 11:38
oui oui
tu as raison.. je me suis confondue
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
2 févr. 2013 à 23:59
Bonjour,

La fonction gets() est obsolète. Utilise plutôt fgets().
Par exemple fgets(mot[i], sizeof mot[i], stdin);
Ensuite, attention s'il a la place, '\n' sera stocké dans mot[i]. Dans il faut comparer mot[i] avec "fin\n". Ou alors supprimé le '\n'.
Je te fais la solution simple. N'hésite pas, si tu veux que je t'explique comment enlever le '\n' qui est plus propre et te permettra de vider le buffer clavier.

Cela donne :
for (i=0; i<30 && strcmp(mot[i], ch) != 0;i++)
     fgets (mot[i]);

Note : il ne faut pas oublier que i doit être inférieur à 30 aussi.
0
Ateuf Messages postés 5 Date d'inscription samedi 2 février 2013 Statut Membre Dernière intervention 17 mars 2013
3 févr. 2013 à 12:17
Salut, merci pour ta solution. En fait, ta réponse me semble la plus proche mais ça ne fonctionne pas . En plus, j'ai pas appris dans mes cours le " fgets " donc je peux pas l'utilser .
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
3 févr. 2013 à 20:49
Oups.
Ce n'est pas fgets(mot[i]), mais fgets(mot[i], sizeof mot[i], stdin) comme j'avais mis dans le corps du mail. J'ai mal recopié dans l'exemple.
C'est vraiment pas normal d'enseigner gets() en cours... C'est obsolète.
M'enfin bref, dans ce cas utilise gets(), et n'oublie pas de mettre "fin\n".
0
Ateuf Messages postés 5 Date d'inscription samedi 2 février 2013 Statut Membre Dernière intervention 17 mars 2013
3 févr. 2013 à 12:14
Merci tout le monde :)
0