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
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
A voir également:
- La condition d'arrêt !
- Arrêt maladie - Guide
- Excel cellule couleur si condition texte - Guide
- Comment supprimer les pubs qui apparaissent sans arrêt - Guide
- Forcer l'arrêt d'une application pc - Guide
- Condition et excel - Guide
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
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.
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.
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
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]);
String ch[4]="fin";
int i ;
for (i=0; mot[i].equals(ch)!=0;i++)
gets (mot[i]);
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
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é.
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é.
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
3 févr. 2013 à 11:38
oui oui
tu as raison.. je me suis confondue
tu as raison.. je me suis confondue
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
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 :
Note : il ne faut pas oublier que i doit être inférieur à 30 aussi.
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.
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
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 .
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
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".
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".
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
3 févr. 2013 à 12:14
Merci tout le monde :)
2 févr. 2013 à 23:53
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 ^^.
3 févr. 2013 à 08:05