Bonsoir, j'essaie de faire un programme qui me demande d'entrer des chiffres à la suite 1 2 3 4 5 6 ... Mais à chaque multiple de 4, je dois entrer 'V' à la place.
Donc 1 2 3 V 5 6 7 V 9 10 11 V ....
Mais comme mon scanf est en %d, je ne vois pas trop comment lire le caractère quand il le faut..
Si quelqu'un a une petite idée ? ![]()
man 3 scanf
%c pour lire un simple caractere (un espace est aussi un caractere...)
Mais je fais un truc du style
do{
scanf("%d",&nb);
...
...
}while(erreur != 1)
Si j'entre 4 au lieu de "V", erreur passe à 1
Il me faut un %d pour 1 2 3 puis il faudrait un %c puis de nouveau un %d ...
Je vois pas trop comment faire ^^'c
tiens a jour un compteur dans ta boucle et une fois sur 4 il faut faire un autre type de scanf...
La bonne réponse est: tu arrêtes immédiatement d'utiliser scanf et tu passes à gets() [ou mieux: fgets]
gets c'est bien pour aller chercher des char*, si OP cherche des int ya pas de mal a utiliser scanf
Parceque maintenant on fait confiance aux utilisateurs pour rentrer les données souhaitées
C'est quand même pas bien compliqué de remplacer scanf par un combo "gets atoi" et ça évite au programme de planter chaque fois que l'utilisateur se trompe
Et puis c'est pas vraiment des int qu'il veut puisqu'un quart du temps il demande une lettre.
c'est clairement un exo basique pour mettre une condition dans un loop. Je maintiens que c'est de l'overkill non pedagogique de passer par du fgets (qui demande de comprendre ce qu'est vraiment stdin, ect). C'est pas le bon niveau de debat pour les soucis d'OP...
Au passage quitte a etre pointilleux, comment tu fais pour savoir si atoi a recu une chaine foireuse du genre "boudi boudin" ou s'il a recu une chaine vraiment equivalente a 0 ?
"Au passage quitte a etre pointilleux, comment tu fais pour savoir si atoi a recu une chaine foireuse du genre "boudi boudin" ou s'il a recu une chaine vraiment equivalente a 0 ?"
Pas besoin de faire de distinction dans cet exercice puisqu'il commence à compter à partir de 1.
Si le atoi() renvoi 0 c'est que dans tous les cas c'est faux.
Maintenant je pense que ça fait un sacré bout de temps que l'OP n'a plus pointé le bout de son nez, j'espère pour lui que c'est parcequ'il a su régler son problème ![]()
scanf a de bonnes utilisations, mais si tu débutes limite je t'interdis de l'utiliser
FPSGammer : C'est quand même pas bien compliqué de remplacer scanf par un combo "gets atoi"
C'est pas compliqué de fermer sa gueule quand on y connait rien... pourtant tu n'y arrives pas.
Il n'y a pas beaucoup de fonctions plus boguées que scanf, mais tu en as quand même citées deux.
gets
tu trouveras partout que cette fonction est intrinsèquement bogué : 1 gets = 1 bug./
atoi
en plus de ne servir à rien ici, c'est bogué et non standard. Pour convertir des chaînes en entier, c'est strtol qu'il faut utiliser.
Bref, hors de ma vue... et ne reviens pas donner des conseils ici avant d'avoir appris à coder.
keeghard : vérifie le code de sortie de scanf dans ta boucle, sinon le jour où on entre autre chose que des entiers, ton code va partir en vrille.
Au passage, scanf enlève les blancs (espaces, tab, etc.) donc la boucle que tu présentes devrait suffire.
Déjà demande de ban pour insulte pour commencer.
Ensuite la personne qui débite un flot incessant de connerie ici c'est bel et bien toi ![]()
Sérieusement, à un tel point que j'ai du mal à savoir si t'es un vieux troll ou un vieil aigris
Reprenons tes propos:
Il n'y a pas beaucoup de fonctions plus boguées que scanf, mais tu en as quand même citées deux.
Scanf n'est pas "boguée", c'est juste que c'est une fonction difficile à maitriser et qui n'est utile que dans certains cas.
tu trouveras partout que cette fonction est intrinsèquement bogué
Oui bien sur, c'est bien connu que les fonctions standards C comportent des bugs. Sais-tu ce qu'est un bug ? Sérieusement ?
Et puis bon, trouve moi 2 liens sérieux sur le net qui prouvent tes dires, parceque j'ai beau chercher, ça n'existe pas.
en plus de ne servir à rien ici, c'est bogué et non standard
Pas standard, c'est sans doute pas ça que c'est défini dans "stdlib.h" ![]()
Buggée, sais-tu ce que ce mot veux dire ? J'ai pas l'impression.
C'est strtol qu'il faut utiliser
Enfin des paroles sensées, évidemment qu'il faut utiliser cette fonction, mais c'est un débutant et cette fonction est bien plus difficile à comprendre
et ne reviens pas donner des conseils ici avant d'avoir appris à coder
Je te retourne le conseil mon ami, et au passage apprend la définition du mot "bug", ça pourra te servir dans la vie
Allez dit-moi, c'est un troll hein ?
Je viens de voir ta cdv: "Enseignant en mathématiques/informatique dans une école d'ingénieurs"
J'imagine tes cours de C
"Bon aujourd'hui on va apprendre le C. N'utilisez pas scanf, c'est buggé, n'utilisez pas printf c'est buggé, n'utilisez pas gets c'est buggué, n'utilisez pas atoi c'est buggé,..., ah oui au fait: tout ce qui est déclaré dans stdlib.h n'est pas standard
"
suffit de faire une petite recherche google pour voir que gets() est dangereux
meme les compilateurs affichent des warning quand on l'utilise ![]()
Au risque de gâcher le suspense, Chris à complètement raison ![]()
"suffit de faire une petite recherche google pour voir que gets() est dangereux"
Dangereux != buggé déjà
Alors oui on peut se retrouver avec un dépassement de tampon quand on utilise gets() [c'est pour ça que je conseille surtout fgets plus haut]. Et même, la plupart des compilateurs actuels "gèrent" ce problème en pratiquent le "Stack-Smashing".
Ca marche pas la regarde t'a un bug dans ta fonction
Non c'est juste dangereux mais ya rien de bug
![]()
Pas standard, c'est sans doute pas ça que c'est défini dans "stdlib.h"
Et atoi est deprecated donc non c'est pas standard, donc arrête de t'enfoncer
atoi() pas standard
C'est probablement une des fonctions les plus standard de tout le langage, c'est conforme dans les normes suivantes:
SVID 3, POSIX, BSD 4.3, ISO/IEC 9899. ISO/IEC 9899:1990 (C89) et POSIX.1
Je ne vois pas ce qu'il te faut de plus
"Et atoi est deprecated."
J'ai déjà expliqué pourquoi j'ai cité atoi plutot que strtol faut que je recommence
"Non c'est juste dangereux mais ya rien de bug"
Juste rien à voir avec la conversation, mais vraiment
C'est festival cet après-midi ou quoi ?
1) Ouais, super... tu as lus ces documents ?
Parce qu'au hasard, le standard C99 (parce que je l'ai sous la main et que c'est un standard plus universel que POSIX et autre), il te dit que le comportement de "atoi(nptr)" est celui de "(int)strtol(nptr, (char **)NULL, 10)" ... sauf quand il y a une erreur (dépassement de capacité), auquel cas tout peu arriver (et on voit de tout suivant les environnements).
Donc oui, c'est cité dans un standard. Et non, c'est pas standard car le comportement n'est pas le même suivant l'environnement (et qu'on ne peut rien y faire, surtout).
2) gets est intrinsèquement bogué. De part sa sémantique, toute utilisation de gets introduit un problème de type buffer overflow, ce que j'ai poliment classé dans la catégorie bug (alors que c'est même une grosse faille de sécurité).
Et si tu comptes sur le système pour te sauver les miches, je te suggère d'aller vérifier par toi-même que ton système gère vraiment avant d'abuser du gets.
3) Je t'achète que scanf n'est pas bogué, et que ce que j'ai dit est maladroit. On peut effectivement éviter les buffer overflows grâce à une syntaxe spéciale que personne ne connaît. En particulier, je suis sûr (et c'est parfaitement normal) que l'OP ne connaît pas cette syntaxe, donc il est susceptible d'introduire des bugs sans le vouloir (d'où ce que j'ai dis).
4) Ta combo gets/atoi, ça s'appelle scanf. Si scanf retourne un entier, c'est pas juste pour que le compilateur floode avec des warnings quand on compile avec des options raisonnables.
5) Les gens mettent ce qu'ils veulent dans leur stdlib.h. On leur imposent un minimum, mais c'est pas interdit d'ajouter des extentions. atoq est, par exemple, un ajout gracieusement offert par GNU (offre valable pour les systèmes GNU/Linux).
6) Pour finir, l'OP a posé une question sur scanf, il peut s'en sortir avec scanf, et il se mange ta réponse basée sur deux des fonctions les plus moisies de toute l'histoire de la programmation. Mon expérience me dit que c'est assurément pas une bonne réponse pour le court terme, et encore moins pour le long terme. Après, je ne suis qu'un enseignant, et toi tu dois sûrement savoir ce que tu fais, du haut des 23 ans affichés dans ton profil. ![]()
Je crois que le problème viens du fait que nous essayons d'atteindre 2 objectifs différents.
Bien sur que je connais les risques liés à l'utilisation de gets (d'ailleurs si tu relis mon premier message tu verras que je conseille surtout fgets) et de atoi. Mais ici nous avons clairement affaire à un débutant du langage C. De mon point de vue ce "combo" est très simple à utiliser (plus simple que scanf) et pour un des premiers programme d'entrainement d'un amateur je trouve ça bien pour débuter [peut-être ai-je tord, c'est mon avis personnel et ça n'engage que moi].
Maintenant c'est vrai que je suis peut-être monté sur mes grands chevaux suite à ta réponse honteusement insultante et puérile ![]()