IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème (programme de ping sous Windows)


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Problème (programme de ping sous Windows)
    Bonjour,
    Ça fait deux jours que je me casse la tête là dessus et je ne parviens pas à trouver mon erreur
    Surtout qu'il m'a semblé que mon programme fonctionnait à la première utilisation, puis le lendemain... plus rien

    Enfin quand je dis "plus rien", voici ce qu'il me donne quand je l'exécute et que je rentre "Thomas" sur l'entrée standard (de Windows) :



    Voici le programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
     
    char * formatChaine (const char * chaine);
    int estIP(const char * chaine);
     
    int main(void)
    {
        char * chaine;
        char result[30];
        chaine = (char*) malloc(20);
        strcpy(result,"ping -t ");
        printf("Ping sur ?\n");
        gets(chaine);
        chaine = formatChaine(chaine);
        if (strcmp(chaine,"thomas")==0)
        {
           strcat(result,"192.168.1.11");
        }
        else if (strcmp(chaine,"cecile")==0)
        {
             strcat(result,"192.168.1.12");
        }
        else if (estIP(chaine))
        {
             strcat(result,chaine);
        }
        else
        {
            printf("Adresse incorrecte !\n");
            system("PAUSE");
            exit(0);
        }
        system(result);
        return 0;
    }
     
    char * formatChaine (const char * chaine)
    {
         char * s;
         s=(char*)malloc(strlen(chaine));
         strcpy(s,chaine);
         int i;
         for(i = 0; i < strlen(chaine); i++)
         {
               s[i] = tolower(s[i]);
               switch(s[i])
               { 
                case 0x82:
                case 0x88:
                case 0x89:
                case 0x8a: s[i]='e'; break;
                case 0xa0:
                case 0x83:
                case 0x84:
                case 0x85:
                case 0x86: s[i]='a'; break;
                case 0x87: s[i]='c'; break;
                case 0x93:
                case 0x94:
                case 0x95:
                case 0xa2: s[i]='o'; break;
                case 0x96:
                case 0x97:
                case 0xa3:
                case 0x81: s[i]='u'; break;
                default: break;
               }
         }
         return(s);
    }
     
    int estIP (const char * chaine)
    {
        int n1;
        int n2;
        int n3;
        int n4;
        int compteurPoint = 0;
        int i;
        for(i = 0; i < strlen(chaine); i++)
        {
              if (chaine[i] == '.')
              {
                 compteurPoint++;
              }
        }
        if (compteurPoint !=3)
           return 0;
        sscanf(chaine,"%d%*[.]%d%*[.]%d%*[.]%d",&n1,&n2,&n3,&n4);
        return(192 <= n1 && n1 < 224 && 0 < n2 && n2 < 255 && 0 < n3 && n3 < 255 && 0 < n4 && n4 < 255);
    }
    Je ne comprends même pas pourquoi cela me donne un tel résultat...
    Merci d'avance à ceux qui m'aideront à avancer

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 29
    Points
    29
    Par défaut
    Félicitations, tu fais de l'overflow !

    En tout cas, ça y ressemble (mais c'est alors très fort).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char * formatChaine (const char * chaine)
    {
         char * s;
         s=(char*)malloc(strlen(chaine));
    strlen(chaine) renvoie le nombre de caractères dans la chaîne... SANS prendre en compte le caractère NULL de fin de chaine, vital en C !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    s=(char*)malloc(strlen(chaine) + 1);
     
    /* Ou meme, tout initialiser a zero */
    s=(char*)calloc(strlen(chaine) + 1);
    C'est déjà mieux comme ça

    Ensuite tu souffres de DEUX fuites mémoire : tu fais deux malloc() et aucun free n'apparait dans ton programme...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Tout d'abord, merci de m'avoir répondu !
    Ensuite, apparemment le problème du strlen n'en est pas vraiment un puisque j'arrive tout de même à faire la bonne comparaison (le result à la fin de mon main a la bonne valeur quand je l'affiche).
    Pour ce qui est de la libération de l'espace mémoire, je l'ai rajouté dans le main, mais j'avoue ne pas savoir comment le faire dans ma fonction formatChaine...
    Comment puis je retourner mon char* si je l'efface de la mémoire ou comment l'effacer de la mémoire une fois retourné ?

    Donc j'en suis là, j'ai corrigé le strlen, et j'ai libéré ma chaine dans le main... et j'ai toujours le même problème...

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Tomystique Voir le message
    Ensuite, apparemment le problème du strlen n'en est pas vraiment un puisque j'arrive tout de même à faire la bonne comparaison (le result à la fin de mon main a la bonne valeur quand je l'affiche).
    hasard total !! malchance...

    Cela veut dire simplement que tu ecrases quelque chose qui ne sers pas a grand chose derriere..

    Sur une autre machine, ou sur la meme mais avec une instruction ou un programme en plus, ca peut crasher...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oui ça je le sais bien, ce que je voulais dire, c'est que malgré mon erreur, le problème ici présenté ne vient pas de là.
    Je précise que j'ai corrigé l'erreur, et que ça ne fonctionne malheureusement toujours pas

    Mais quand même, je me pose une question, comment le programme peut-il ré afficher "Ping sur ?" après que j'ai récupéré la chaine sur l'entrée standard alors que je ne boucle pas ?
    J'ai tracé son exécution et tout va bien jusqu'au system(result); ou il ne fait pas ce qu'il devrait faire...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par groscask Voir le message
    Félicitations, tu fais de l'overflow !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    s=(char*)malloc(strlen(chaine) + 1);
     
    /* Ou meme, tout initialiser a zero */
    s=(char*)calloc(strlen(chaine) + 1);
    C'est déjà mieux comme ça
    Et si un char est sur deux octets, tu affiches quoi ? Segfault ?

    PS : malloc() / calloc() renvoient un void *, donc pointeur génerique, donc cast inutile.

    PS2 : En general, on verifie aussi le retour de l'allocation, histoire de ne pas utiliser strcat() sur un pointeur nul...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Et si j'utilise sizeof(chaine) au lieu de strlen(chaine) + 1, ça serait mieux ?

    Par ailleurs, mon compilateur foire quand je ne cast pas le retour du malloc...
    Pour la vérif sur le retour d'allocation, je l'ai rajouté, j'avais complètement zappé ^^, merci

    Est ce que mon problème pourrait venir de mon compilateur (Dev-C++) ?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Citation Envoyé par Tomystique Voir le message
    Et si j'utilise sizeof(chaine) au lieu de strlen(chaine) + 1, ça serait mieux ?
    Non, car chaîne est un char* et pas un tableau.

    Citation Envoyé par Tomystique Voir le message
    Par ailleurs, mon compilateur foire quand je ne cast pas le retour du malloc...
    Pour la vérif sur le retour d'allocation, je l'ai rajouté, j'avais complètement zappé ^^, merci

    Est ce que mon problème pourrait venir de mon compilateur (Dev-C++) ?
    Vérifie que tu compiles bien en C et non en C++ : http://www.developpez.net/forums/sho...37&postcount=5

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oui Médinoc je compile bien en C (j'avais moi même vérifié avant, ayant déjà fait cette bourde dans un autre programme ^^).

    Bref, quelqu'un aurait il d'autres idées ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Tu peux nous montrer l'erreur que tu obtiens sans le cast ?

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Tusbar Voir le message
    Et si un char est sur deux octets, tu affiches quoi ? Segfault ?
    sizeof(char) == 1 par definition...

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu peux nous montrer l'erreur que tu obtiens sans le cast ?
    Bon alors là je suis vraiment un gros boulet... ça compile sans le cast... je dois avoir des hallucinations...

    Mais ça ne résout toujours pas mon problème... et je ne comprends toujours pas comment mon programme peut boucler comme il le fait... ça m'enneeeerve

Discussions similaires

  1. Problème d'execution c++ sous windows
    Par maxetime dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2006, 14h39
  2. problème fin de string sous windows 98
    Par LAPLACE dans le forum Windows
    Réponses: 1
    Dernier message: 07/03/2006, 11h09
  3. Problème de mon appli sous windows 2000
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2006, 12h03
  4. Liste des programme ou applications sous windows xp
    Par bob40 dans le forum Windows XP
    Réponses: 1
    Dernier message: 12/01/2006, 02h14
  5. problème d'installation module sous windows
    Par Ickou dans le forum Modules
    Réponses: 2
    Dernier message: 21/10/2005, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo