Débutant need Help en C - C - Programmation
Marsh Posté le 04-05-2010 à 06:06:36
Salut,
Même si elle peut sembler simple et efficace, je te conseille vivement d'éviter la fonction scanf pour de nombreuses raisons. Ces raisons sont entre autres évoquées sur le site du zero, tutorial que tu peux lire ici:
http://www.siteduzero.com/tutoriel [...] fgets.html
Voici ma solution, certainement pas parfaite mais fonctionnelle
Code :
|
Je t'explique le principe vite fait: Quand un utilisateur rentre une donnée, elle est toujours de type char *. C'est à dire que quelque soit l'entrée utilisateur, même si c'est un nombre, tu ne pourras récupérer cette entrée que sous forme d'un char * qui contient ce qui t'intéresse.
Toi tu le veux en int. Tu as un char *, c'est balot Tu remarqueras qu'effectivement scanf te permettait de récupérer ET de transformer le char * en int. Très pratique, oui mais piège. Je suis très loin d'être un expert en C, mais je n'aime pas du tout scanf. Donc ce que je fais dans le code, c'est de faire le job de scanf mais à la main.
D'abord je récupère l'entrée utilisateur avec fgets. fgets prend trois paramètres : Un buffer (la zone ou va être stocké ce qu'a tapé l'utilisateur), la taille de ce buffer (C ne peut pas le deviner tout seul ) et le file descriptor a partir duquel je veux récupérer mes données. Si tu n'as pas vu les file descriptors, saches simplement que l'entrée utilisateur = stdin. (Il faut inclure <stdio.h> pour éviter les erreurs de compilation)
Ensuite je fais un atoi de ce buffer, que je récupère dans la variable nommée choix. Seul problème: Si notre buffer contenait un truc pas convertible en nombre (par exemple si l'utilisateur a tapé efjdsijfisj au lieu de 0, 1, 2...) atoi renverrait le code d'erreur "0". Et alors, comment faire pour différencier le 0 qui aurait pu être entré par l'utilisateur du 0 qui signifie "Attention, erreur !" ?
La solution la plus simple (pas forcément la meilleure, comme je t'ai dit précédemment je suis pas un expert ), c'est de regarder quel est le premier caractère de notre buffer. Si le premier caractère n'est pas 0 mais que la variable choix est a 0, cela veut dire qu'atoi a renvoyé une erreur => On met choix a -1 pour éviter de sortir de la boucle et on affiche le message d'erreur.
Le reste c'est ton code. Le strlen(buffer) == BUFFER_SIZE - 1 permet de savoir si l'utilisateur a rentré trop de données en entrée. Si c'est le cas, on "vide" l'entrée avant de repartir au début (ceci évitant notamment une boucle infinie )
Bref je sais que pas mal de trucs que je dis peuvent paraître plus qu'obscurs, mais c'est pas si compliqué au final Au pire continues d'apprendre avant de vouloir gérer ces cas, c'est pas forcément facile au début
Marsh Posté le 04-05-2010 à 18:04:12
Merci pour ton aide WiiDS !
Je vais sûrement être amené à re-poster ici vu la super soluce que tu m'as filé !
Marsh Posté le 19-05-2010 à 17:44:45
Bonjour à tous,
Je fais suite à mon premier message de demande d'aide ; je suis à nouveau dans le besoin par rapport à mon application en C.
Petit explication : je cherche à créer une application de conversion monétaire. Je veux dans un premier temps écrire dans un fichier Texte des devises et ensuite pouvoir les récupérer pour effectuer les conversions.
Pour cela, j'ai besoin d'écrire dans le fichier de cette façon :
Numéro "d'identifiant" de la ligne, Nom de la Devise, Pays associé, Montant, Date du jour de la saisie
Ce qui pourrait se présenter comme ceci :
01, Dollar, USA, 0.80, 19/05/2010
02, Euro, Europe, 1.00, 19/05/2010
03, Yen, Japon, 15.58, 19/05/2010
Etc...
J'ai 3 problèmes face à moi :
1/ Comment faire comprendre à l'ordinateur que je veux écrire à chaque début de ligne ce numéro d'identifiant en incrémentation
2/ Comment lui faire comprendre que je veux un retour à la ligne à chaque fin de mes saisies
3/ Comment enregistrer de façon automatique la date système
Voilà, j'ai plein d'autres problèmes dans ma liste (:D) mais ceux-ci sont les principaux actuellement... S'il y a des personnes qui savent faire ceci sans trop se casser la tête, je leur serai reconnaissant de m'éclairer sur le sujet !
Merci d'avance.
Marsh Posté le 19-05-2010 à 18:00:52
Bubu92 a écrit : 1/ Comment faire comprendre à l'ordinateur que je veux écrire à chaque début de ligne ce numéro d'identifiant en incrémentation |
C'est a toi de maintenir une variable numéro de ligne dans ton programme de lecture écriture
Bubu92 a écrit : 2/ Comment lui faire comprendre que je veux un retour à la ligne à chaque fin de mes saisies |
print("blabla\n" );
Bubu92 a écrit : 3/ Comment enregistrer de façon automatique la date système |
Utiliser les fonctions standard de la librairie, dans <time.h>
A+,
Marsh Posté le 19-05-2010 à 19:29:07
J'ai fait un bout de code avec l'aide d'un ami mais il y a quelques erreurs, je vous affiche le machin :
Code :
|
Avec ce code, mon compilateur m'indique trois erreurs, dont deux pour la ligne "for (i=0; i<MAX_entree; i++)" et une pour la date :
- 'MAX_entree' undeclared (first use in this function)
- (Each undeclared identifier is reported only once for each function is appears in.)
- Syntax error before "date"
Marsh Posté le 19-05-2010 à 20:38:06
Bubu92 a écrit : - 'MAX_entree' undeclared (first use in this function) |
Le message d'erreur est explicite.
Bubu92 a écrit : - Syntax error before "date" |
il y a pas de fonction date() dans la librairie C standard.
A+,
Marsh Posté le 19-05-2010 à 21:26:03
J'ai ajouté "#define MAX_entree 200", le message d'erreur n'apparait plus.
J'ai mis "#include <time.h>" mais le message d'erreur est toujours présent...
Marsh Posté le 20-05-2010 à 00:57:52
fprintf ne prend pas un file descriptor en premier paramètre ?
Je veux pas dire de bêtises mais je verrais plus un truc comme ça:
Code :
|
Avec #include <stdio.h> évidemment
Marsh Posté le 20-05-2010 à 06:55:31
Bubu92 a écrit : J'ai ajouté "#define MAX_entree 200", le message d'erreur n'apparait plus. |
Je te rajoute une question mais... tu fais comment pour sortir si tu veux pas te pastiller 200 saisies à chaque fois ?
Marsh Posté le 20-05-2010 à 14:36:27
Bubu92 a écrit : J'ai mis "#include <time.h>" mais le message d'erreur est toujours présent... |
Et ça va changer quoi?
S'il y a pas de fonction date(), il y a pas de fonction date(). Ajouter un header ne changera rien a ce fait.
Faire "#include <time.h>" est une bonne chose, mais encore faut il en lire la doc et utiliser les fonctions de cette librairie, en l'occurence time, localtime et strftime.
A+,
Marsh Posté le 21-05-2010 à 19:36:38
WiiDS a écrit : fprintf ne prend pas un file descriptor en premier paramètre ?
|
Ou plus simplement
Code :
|
Marsh Posté le 22-05-2010 à 03:18:00
Sve@r a écrit :
|
Aussi
Marsh Posté le 04-05-2010 à 00:20:19
Bonjour à tous,
J'ai un soucis avec un programme que je suis en train de développer. Je vous explique la situation :
Je cherche à créer un menu avec des choix de type "int" et je switch en fonction du choix effectué.
Le programme fonctionne bien quand on saisi un chiffre. Malheureusement, dès qu'on saisi autre chose que du "int", le programme bug et tourne en boucle, ce qui est fort gênant...
Je vous colle le code que j'ai fait :
Je débute en programmation, j'ai suivi les cours disponibles sur le site "Lesiteduzéro"...
Je pense que le problème vient du fait que je lui demande une saisie de type "int". Si on saisir du "char", l'ordinateur ne comprend pas et donc, on se retrouve dans un monde merdique. Mais je ne saurai pas comment résoudre ce souci, donc si des personnes s'y connaissent, merci de m'éclairer !
Message édité par Bubu92 le 19-05-2010 à 17:31:57