La condition d'arrêt !
Résolu
Ateuf
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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]);
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]);
A voir également:
- La condition d'arrêt !
- Arrêt maladie - Guide
- Excel cellule couleur si condition texte - Guide
- La Sécurité sociale durcit les règles - Ces médecins ne pourront plus délivrer d'arrêt maladie - Guide
- Bouton marche arret i o - Forum Word
- Forcer arret application windows - Guide
4 réponses
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.
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]);
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é.
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.
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 ^^.