Transmission par adresse en C
Résolu
C&M
-
C&M -
C&M -
Bonjour,
Le sous programme suivant est censé transmettre par adresse l'heure et les minutes rentrées par un utilisateur. Dans le Sous programme, l'affichage fonctionne correctement (printf("h : %d\n", *heure);printf("m : %d", *minute);)
Mais dans le main, quand je demande l'affichage de l'heure et des minutes, je n'ai qu'une suite de chiffres incohérents.
Y a t il un probleme dans la transmission par adresse dans ce sous programme ?
Merci d'avance
int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;
printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%s",horloge);
c=getchar();
*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);
return strlen(horloge);
}
Le sous programme suivant est censé transmettre par adresse l'heure et les minutes rentrées par un utilisateur. Dans le Sous programme, l'affichage fonctionne correctement (printf("h : %d\n", *heure);printf("m : %d", *minute);)
Mais dans le main, quand je demande l'affichage de l'heure et des minutes, je n'ai qu'une suite de chiffres incohérents.
Y a t il un probleme dans la transmission par adresse dans ce sous programme ?
Merci d'avance
int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;
printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%s",horloge);
c=getchar();
*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);
return strlen(horloge);
}
A voir également:
- Transmission par adresse en C
- Darkino nouvelle adresse - Guide
- Adresse mac - Guide
- Changer adresse dns - Guide
- Adresse url - Guide
- Comment connaître son adresse ip - Guide
7 réponses
Si dans le sous-programme ça fonctionne bien, le problème vient a priori de la fonction appelante (main dans ton cas()).
Pourrais-tu poster la fonction main() ?
Pourrais-tu poster la fonction main() ?
voici le programme en sa totalite :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define DIMHEURE 4
int Saisie_Heure(int* minute, int* heure);
int Compare_Heure(int minute,int heure);
int main()
{
int longueur_horloge;
int min,h;
int erreur;
longueur_horloge=Saisie_Heure(&min, &h);
printf("m : %d\n", min);
printf("h : %d\n", h);
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
{
printf("a");
printf("\nErreur : Mauvais Format dans l'heure\n");
longueur_horloge=Saisie_Heure(&min, &h);
}
erreur=Compare_Heure(min,h);
printf("b");
while(erreur==1)
{ printf("c");
printf("\nErreur, l'heure saisie est d%cpass%ce\n",130,130);
longueur_horloge=Saisie_Heure(&min, &h);
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
{
printf("d");
printf("\nErreur : Mauvais Format dans l'heure\n");
longueur_horloge=Saisie_Heure(&min, &h);
}
erreur=Compare_Heure(min,h);
}
printf("e");
return 0;
}
int Compare_Heure(int minute,int heure)
{
int erreur=0;
time_t timestamp;//on recupere la date
struct tm * t;
timestamp = time(NULL);
t = localtime(×tamp);
if(heure>=t->tm_hour)
{
if(minute>t->tm_min)
erreur=0;
else erreur=1;
}
else erreur=1;
return erreur;
}
int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;
printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%s",horloge);
c=getchar();
*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);
return strlen(horloge);
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define DIMHEURE 4
int Saisie_Heure(int* minute, int* heure);
int Compare_Heure(int minute,int heure);
int main()
{
int longueur_horloge;
int min,h;
int erreur;
longueur_horloge=Saisie_Heure(&min, &h);
printf("m : %d\n", min);
printf("h : %d\n", h);
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
{
printf("a");
printf("\nErreur : Mauvais Format dans l'heure\n");
longueur_horloge=Saisie_Heure(&min, &h);
}
erreur=Compare_Heure(min,h);
printf("b");
while(erreur==1)
{ printf("c");
printf("\nErreur, l'heure saisie est d%cpass%ce\n",130,130);
longueur_horloge=Saisie_Heure(&min, &h);
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
{
printf("d");
printf("\nErreur : Mauvais Format dans l'heure\n");
longueur_horloge=Saisie_Heure(&min, &h);
}
erreur=Compare_Heure(min,h);
}
printf("e");
return 0;
}
int Compare_Heure(int minute,int heure)
{
int erreur=0;
time_t timestamp;//on recupere la date
struct tm * t;
timestamp = time(NULL);
t = localtime(×tamp);
if(heure>=t->tm_hour)
{
if(minute>t->tm_min)
erreur=0;
else erreur=1;
}
else erreur=1;
return erreur;
}
int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;
printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%s",horloge);
c=getchar();
*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);
return strlen(horloge);
}
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
cette lignes est fausse mais plutot :
while(longueur_horloge!=DIMHEURE||min<0||min>59||h<0||h>23)
cette lignes est fausse mais plutot :
while(longueur_horloge!=DIMHEURE||min<0||min>59||h<0||h>23)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
je pense qu'avec cela ca devrait le faire....
ou
A mon avis le problème vient de la non initialisation du tableau char horloge[DIMHEURE]....strlen(horloge) attend un zéro terminal qu'il ne trouve pas... et apres je vois pas trop ce qui se passe....si quelqu'un peu eclairer ma lanterne aussi!!;)
@+
Ce n'est pas parce que certaines choses semblent inexplicables, qu'il faut faire semblant de les expliquer!
je pense qu'avec cela ca devrait le faire....
#define DIMHEURE 5 int Saisie_Heure(int* minute, int* heure) { char horloge[DIMHEURE]; unsigned char error=0; do{ memset(horloge,0,DIMHEURE); printf("Choisissez une heure de fermeture automatique (hhmm) :\n"); scanf("%s",&horloge[0]); if (horloge[DIMHEURE-1]==0){ if (strlen(horloge)==DIMHEURE-1){ *heure=10*(horloge[0]-48)+(horloge[1]-48); error=(*heure>=0 && *heure<24)? 0 :1; if(!error){ *minute=10*(horloge[2]-48)+(horloge[3]-48); error=(*minute>=0 && *minute<60)? 0 :1; printf("h : %d\n", *heure);printf("m : %d", *minute); } } else error=1; } else error=1; }while(error); return strlen(horloge); }
ou
void Saisie_Heure(int* minute, int* heure) { int horloge; unsigned char error=0; do { printf("Choisissez une heure de fermeture automatique (hhmm) :\n"); scanf("%d",&horloge); if(horloge>99){ *heure=horloge/100; error=(*heure>0 && *heure<25)? 0 :1; if (!error){ *heure=(*heure==24)?0:*heure; *minute=horloge%100; error=(*minute>=0 && *minute<60)? 0 :1; } } else error=1; } while(error); }
A mon avis le problème vient de la non initialisation du tableau char horloge[DIMHEURE]....strlen(horloge) attend un zéro terminal qu'il ne trouve pas... et apres je vois pas trop ce qui se passe....si quelqu'un peu eclairer ma lanterne aussi!!;)
@+
Ce n'est pas parce que certaines choses semblent inexplicables, qu'il faut faire semblant de les expliquer!
#define DIMHEURE 4
int longueur_horloge;
int min,h;
printf("%X %X\n",&min,&h);//adresse de min et h
longueur_horloge=Saisie_Heure(&min, &h);
printf("%X %X\n",&min,&h);//adresse de min et h ont été modifiée.....
#define DIMHEURE 5
int longueur_horloge;
int min,h;
printf("%X %X\n",&min,&h);//adresse de min et h
longueur_horloge=Saisie_Heure(&min, &h);
printf("%X %X\n",&min,&h);//adresse de min et h identique a celle avant l'appel de la fonction....
Le probleme vient du scanf dans la fonction Saisie_Heure.....mais je vois pas pourquoi...
par ailleurs:
#define DIMHEURE 4
int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;
printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%4c",&horloge[0]);
*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);
return strlen(horloge);
}
fonctionne bien......
Certainement un buffer overflow.....mais je vois pas en quoi cela devrait affecter les adresses de min et h......
int longueur_horloge;
int min,h;
printf("%X %X\n",&min,&h);//adresse de min et h
longueur_horloge=Saisie_Heure(&min, &h);
printf("%X %X\n",&min,&h);//adresse de min et h ont été modifiée.....
#define DIMHEURE 5
int longueur_horloge;
int min,h;
printf("%X %X\n",&min,&h);//adresse de min et h
longueur_horloge=Saisie_Heure(&min, &h);
printf("%X %X\n",&min,&h);//adresse de min et h identique a celle avant l'appel de la fonction....
Le probleme vient du scanf dans la fonction Saisie_Heure.....mais je vois pas pourquoi...
par ailleurs:
#define DIMHEURE 4
int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;
printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%4c",&horloge[0]);
*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);
return strlen(horloge);
}
fonctionne bien......
Certainement un buffer overflow.....mais je vois pas en quoi cela devrait affecter les adresses de min et h......
Bonjour,
Tu dois réserver une place de 5 caractères pour ta chaîne horloge.
En effet, le scanf("%s",...) va te stocker un \0 à la fin. De plus c'est un caractère indispensable pour l'évaluation de la longueur d'une chaîne (strlen).
De plus scanf() est une fonction très dangereuse lorsqu'elle mal utilisée. Je te conseille de mettre : scanf("%4s",horloge) (rajout du 4) pour éviter que l'utilisateur puisse entrer une chaîne plus grande que prévue et récrire dans la pile (surtout sur l'adresse de retour de la fonction) provoquant un segfault inévitable.
Du coup ton : while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23) devra se transformer en longueur_horloge!=DIMHEURE-1...
Ensuite : horloge[1]-48, je te conseille de plutôt mettre horloge[1]-'0'. C'est plus portable et plus lisible.
Si t'as des autres questions, n'hésite pas.
Cdlt,
Tu dois réserver une place de 5 caractères pour ta chaîne horloge.
En effet, le scanf("%s",...) va te stocker un \0 à la fin. De plus c'est un caractère indispensable pour l'évaluation de la longueur d'une chaîne (strlen).
De plus scanf() est une fonction très dangereuse lorsqu'elle mal utilisée. Je te conseille de mettre : scanf("%4s",horloge) (rajout du 4) pour éviter que l'utilisateur puisse entrer une chaîne plus grande que prévue et récrire dans la pile (surtout sur l'adresse de retour de la fonction) provoquant un segfault inévitable.
Du coup ton : while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23) devra se transformer en longueur_horloge!=DIMHEURE-1...
Ensuite : horloge[1]-48, je te conseille de plutôt mettre horloge[1]-'0'. C'est plus portable et plus lisible.
Si t'as des autres questions, n'hésite pas.
Cdlt,
La même chose que 'horloge[1]-48' ... Pour faire simple, disons que les codes ASCII prennent un valeur comprise entre 0 et 255 (prière de ne pas polémiquer); chaque valeur représente un caractère, et il se trouve que la valeur 48 correspond au caractère '0', la valeur 49 au caractère '1', la valeur 50 au caractère '2' ...
Bonne continuation.
Bonne continuation.