Transmission par adresse en C
Résolu/Fermé
A voir également:
- Transmission par adresse en C
- Rechercher ou entrer l'adresse - Guide
- Darkino nouvelle adresse - Guide
- Darkino : le grand site pirate change d'adresse et d'interface - Accueil - Services en ligne
- Adresse mac - Guide
- Créer une adresse hotmail - Guide
7 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
11 mai 2010 à 20:41
11 mai 2010 à 20:41
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
chuka
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
378
Modifié par chuka le 13/05/2010 à 10:14
Modifié par chuka le 13/05/2010 à 10:14
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!
chuka
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
378
Modifié par chuka le 13/05/2010 à 11:20
Modifié par chuka le 13/05/2010 à 11:20
#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......
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
13 mai 2010 à 14:14
13 mai 2010 à 14:14
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,
Genial, merci beaucoup vous avez été tres clair!
Par contre, que signifie horloge[1]-'0' ?
Par contre, que signifie horloge[1]-'0' ?
chuka
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
378
13 mai 2010 à 23:08
13 mai 2010 à 23:08
le caractere '0' = 48
pour le verifier:
char m='0';
printf("%c %d",m,m);
@+
pour le verifier:
char m='0';
printf("%c %d",m,m);
@+
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
13 mai 2010 à 23:15
13 mai 2010 à 23:15
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.