Bonjour. Ci-dessus vous pouvez voir le code qui fonctionne, néanmoins j'ai quand même un question.
J'ai longtemps bloqué sur le fait que la partie décimale renvoyée lorsque je mettais une virgule était nul.
J'ai trouvé que le problème vient du type de pointeur dans la fonction LireDouble(), si je met:
1
int*virgule = NULL;
La partie décimale est automatiquement mise à 0.
Cependant avec:
1
char *virgule = NULL;
là ça marche sans problème
Alors je ne comprends pas pourquoi le pointeur ici doit être de type char et un pas un autre, je pensais que le char pouvait aller de -127 à 128 alors comment peut il stocker une adresse qui fait souvent quelques millions en valeur.
Sur mon ordi, char* contient 8 octets et int* pareil mais ducoup je ne comprend pas pourquoi la fonction lireDouble() fonctionne avec char* et pas avec int* si ils contiennent tout les deux le même nombres d'octets, ils devraient fonctionner pareil non ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void viderBuffer();
int lire(char* chaine, int longueur);
double lireDouble();
int main(int argc, char *argv[])
{
double poids = 0;
printf("Quel est votre poids ? :");
poids = lireDouble();
printf("Ah vous pesez donc %lf kilos", poids);
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;
}
}
double lireDouble()
{
double nombreTexte[100] = {0};
char *virgule = NULL;
if (lire(nombreTexte, 100))
{
virgule = strchr(nombreTexte, ',');
if (virgule != NULL)
virgule[0] = '.';
return strtod(nombreTexte, NULL);
}
else
return 0;
}
Parce que dans l'exercice on veut pouvoir entrer un nombre avec une virgule et qu'il soit valide, mais peu importe si on lit du char le problème c'est le pointeur virgule que je ne comprend pas, si je met
int* virgule = NULL;
Ca marche pas alors qu'avec
char* virgule = NULL;
Ca marche
Ma question c'est pourquoi en fonction du type du pointeur "virgule" dans ce programme ça fonctionne ou pas ?
Parce que quand tu écris virgule[0] = '.'; si c'est un char il écrira juste le point donc sur 1 octets mais si c'est un int, il va en écrire un peu plus ! puisqu'il va écrire comme si c'était un int donc sizeof(int) octets. ça va donc écraser des cases du tableau de char.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void viderBuffer();
int lire(char* chaine, int longueur);
double lireDouble();
int main(int argc, char *argv[])
{
double poids = 0;
printf("Quel est votre poids ? :");
poids = lireDouble();
printf("Ah vous pesez donc %lf kilos", poids);
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;
}
}
double lireDouble()
{
char nombreTexte[100] = {0};
char *virgule = NULL;
if (lire(nombreTexte, 100))
{
virgule = strchr(nombreTexte, ',');
if (virgule != NULL)
virgule[0] = '.';
return strtod(nombreTexte, NULL);
}
else
return 0;
}
MaximeA3 a écrit:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void viderBuffer();
int lire(char* chaine, int longueur);
double lireDouble();
int main(int argc, char *argv[])
{
double poids = 0;
printf("Quel est votre poids ? :");
poids = lireDouble();
printf("Ah vous pesez donc %lf kilos", poids);
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;
}
}
double lireDouble()
{
double nombreTexte[100] = {0};
char *virgule = NULL;
if (lire(nombreTexte, 100))
{
virgule = strchr(nombreTexte, ',');
if (virgule != NULL)
virgule[0] = '.';
return strtod(nombreTexte, NULL);
}
else
return 0;
}
Parce que dans l'exercice on veut pouvoir entrer un nombre avec une virgule et qu'il soit valide, mais peu importe si on lit du char le problème c'est le pointeur virgule que je ne comprend pas, si je met
int* virgule = NULL;
Ca marche pas alors qu'avec
char* virgule = NULL;
Ca marche
Ma question c'est pourquoi en fonction du type du pointeur "virgule" dans ce programme ça fonctionne ou pas ?
Merci d'avance.
ça fonction parce que la fonction strchr(nombreTexte,','); renvoi un poiteur vers le caractère que tu recherche c'est le pour cela tu déclare comme ce si sa fonction char* virgule = NULL; la fonction strchr renvoi toujours un poienteur vers le caratère rechercher c'est le pour cela si tu mais mais int *virgule = NULL; sa ne mache pas
J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?
J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?
Salut nan j'ai copié-coller le code directement dans le chat sans passer par l'insertion de code.
J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?
Ma synthèse vocale n'a pas crié plus fort que d'habitude, en tout cas.
Le Tout est souvent plus grand que la somme de ses parties.
J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?
non
séparateur de partie décimale
× 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.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Le Tout est souvent plus grand que la somme de ses parties.