Dans le dernier chapitre du cours suivant https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16993-securisez-la-saisie-de-texte#/id/r-2190666 je ne comprend pas les instructions données:
Ensuite, modifiez votre fonction lireDouble pour qu'elle accepte aussi le symbole virgule comme séparateur décimal :
Remplacez la virgule par un point dans la chaîne de texte lue (grâce à la fonction de recherche strchr).
Puis envoyez la chaîne modifiée à strtod.
On est censé modifier je pense, le code suivant de sorte à retourner un double et pouvoir écrire des décimaux dans la console:
void viderBuffer()
{
int c = 0;
while (c != '\n' && c != EOF)
{
c = getchar();
}
}
int lire(char *chaine, int longueur)
{
char *positionEntree = NULL;
if (fgets(chaine, longueur, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if (positionEntree != NULL)
{
*positionEntree = '\0';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}
long lireLong()
{
char nombreTexte[100] = {0}; // 100 cases devraient suffire
if (lire(nombreTexte, 100))
{
// Si lecture du texte ok, convertir le nombre en long et le retourner
return strtol(nombreTexte, NULL, 10);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}
}
int main(int argc, char *argv[])
{
long age = 0;
printf("Quel est votre age ? ");
age = lireLong();
printf("Ah ! Vous avez donc %d ans !\n\n", age);
return 0;
}
void viderBuffer()
{
int c = 0;
while (c != '\n' && c != EOF)
{
c = getchar();
}
}
int lire(char *chaine, int longueur)
{
char *positionEntree = NULL;
if (fgets(chaine, longueur, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if (positionEntree != NULL)
{
*positionEntree = '\0';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}
long lireDouble()
{
char nombreTexte[100] = {0}; // 100 cases devraient suffire
if (lire(nombreTexte, 100))
{
return strtod(nombreTexte, NULL);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}
}
int main(int argc, char *argv[])
{
long age = 0;
printf("Quel est votre age ? ");
age = lireDouble();
printf("Ah ! Vous avez donc %d ans !\n\n", age);
return 0;
}
Mais je ne comprend pas de quelle virgule qui doit être remplacée par un point les instructions parlent et que le code que j'ai modifier refuse d'afficher des décimaux dans la console. Quelqu'un comprendrait-il comment le code doit-être modifié afin de pouvoir afficher des décimaux en console ?
Mais je ne comprend pas de quelle virgule qui doit être remplacée par un point les instructions parlent
Le séparateur des décimale pour les nombres à virgule c'est le point or si le gars tape une virgule, il faut la remplacer par un point.
1Stark a écrit:
et que le code que j'ai modifier refuse d'afficher des décimaux dans la console. Quelqu'un comprendrait-il comment le code doit-être modifié afin de pouvoir afficher des décimaux en console ?
Ta fonction lireDouble devrait retourner un double, or elle retourne un long ?!
Et ta variable age devrait être un double.
(entre parenthèses pour afficher un long on utilise le descripteur %ld).
@1Stark: Tu as utilisé strchr() pour remplacer le '\n' par un '\0'. Tu pourrais peut-être l'utiliser pour remplacer la ',' par un '.' ... Et du même coup vérifier qu'il n'y a pas plus d'une seule virgule.
Attention aux petits malins qui mettraient à la fois une virgule et un point ...
- Edité par PierrotLeFou 22 mars 2023 à 23:15:16
Le Tout est souvent plus grand que la somme de ses parties.
J'ai enlevé le commentaire qui prête à confusion dans la fonction lireDouble(), j'ai attribuer à la variable "age" le type double, puis après avoir tenté les suggestions sans obtenir le résultat voulu, j'ai tenté de changer le "%d" par un "%f" et le code à bien accepté le point en console mais n'affiche que des zéros après ce point:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // Penser à inclure string.h pour strchr()
#include <ctype.h>
void viderBuffer()
{
int c = 0;
while (c != '\n' && c != EOF)
{
c = getchar();
}
}
int lire(char *chaine, int longueur)
{
char *positionEntree = NULL;
if (fgets(chaine, longueur, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if (positionEntree != NULL)
{
*positionEntree = '\0';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}
long lireDouble()
{
char nombreTexte[100] = {0}; // 100 cases devraient suffire
if (lire(nombreTexte, 100))
{
return strtod(nombreTexte, NULL);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}
}
int main(int argc, char *argv[])
{
double age = 0;
printf("Quel est votre age ? ");
age = lireDouble();
printf("Ah ! Vous avez donc %f ans !\n\n", age);
return 0;
}
@PierrotLeFou:
apparemment le code remplace déjà automatiquement les virgules par des points et supprime les points en trop: J'ai essayé de taper "56.,456" et la console m'a affiché:
Quel est votre age ? 56.,456
Ah ! Vous avez donc 56.000000 ans !
Mais je n'arrive pas à afficher par exemple "56.400000" lorsque j'écris 56.4
Je ne comprends pas pourquoi tu veux écrire ton âge avec à la fois une virgule et un point! Habituellement on utilise la virgule.
On peut "expliquer" à la fonction strtod() comment lire les nombres écrits par des Français; mais le cours de propose de faire autrement. Tu dois transformer le nombre saisi (en France donc qui utilise la virgule), en un nombre compris par la fonction strtod() qui considère que le séparateur décimal est un point (à l'anglaise). C'est ce qui t'as déjà été dit:
rouloude a écrit:
1Stark a écrit:
Mais je ne comprend pas de quelle virgule qui doit être remplacée par un point les instructions parlent
Le séparateur des décimale pour les nombres à virgule c'est le point or si le gars tape une virgule, il faut la remplacer par un point.
PierrotLeFou a écrit:
@1Stark: Tu as utilisé strchr() pour remplacer le '\n' par un '\0'. Tu pourrais peut-être l'utiliser pour remplacer la ',' par un '.' ... Et du même coup vérifier qu'il n'y a pas plus d'une seule virgule.
J'ajoute que la fonction strchr() qui peut remplacer la virgule par un point doit être utilisée à la ligne 45.
@edgarjacobs J'étais persuadé d'avoir changé le type que ma fonction renvoie. Le code fonctionne à présent comme voulu:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // Penser à inclure string.h pour strchr()
#include <ctype.h>
void viderBuffer()
{
int c = 0;
while (c != '\n' && c != EOF)
{
c = getchar();
}
}
int lire(char *chaine, int longueur)
{
char *positionEntree = NULL;
if (fgets(chaine, longueur, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if (positionEntree != NULL)
{
*positionEntree = '\0';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}
double lireDouble()
{
char nombreTexte[100] = {0}; // 100 cases devraient suffire
if (lire(nombreTexte, 100))
{
return strtod(nombreTexte, NULL);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}
}
int main(int argc, char *argv[])
{
double age = 0;
printf("Quel est votre age ? ");
age = lireDouble();
printf("Ah ! Vous avez donc %f ans !\n\n", age);
return 0;
}
@Dalfab Je n'essayais pas d'afficher l'age avec à la fois un point et une virgule: On m'a suggéré de placer une sécurité dans le code contre une éventuelle fois ou l'on placerait à la fois un point et une virgule puis j'ai fait part de mes observations.
Après avoir changé le type de la fonction j'ai changé comme suggéré le "\n" par un "," et le "\0" par un "." ce qui me donne le code suivant qui remplace bien les virgules par des points:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // Penser à inclure string.h pour strchr()
#include <ctype.h>
void viderBuffer()
{
int c = 0;
while (c != '\n' && c != EOF)
{
c = getchar();
}
}
int lire(char *chaine, int longueur)
{
char *positionEntree = NULL;
if (fgets(chaine, longueur, stdin) != NULL)
{
//positionEntree = strchr(chaine, '\n');
positionEntree = strchr(chaine, ',');
if (positionEntree != NULL)
{
//*positionEntree = '\0';
*positionEntree = '.';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}
double lireDouble()
{
char nombreTexte[100] = {0}; // 100 cases devraient suffire
if (lire(nombreTexte, 100))
{
return strtod(nombreTexte, NULL);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}
}
int main(int argc, char *argv[])
{
double age = 0;
printf("Quel est votre age ? ");
age = lireDouble();
printf("Ah ! Vous avez donc %f ans !\n\n", age);
return 0;
}
Merci à tous.
Cordialement
Retourner un double avec la fonction strtod
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
En recherche d'emploi.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent