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 :

Exercice en programmation C


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1
    Par défaut Exercice en programmation C
    Bonjour,
    J'ai un exercice en programmation C et j'ai besoin d'aide pour le résoudre .
    Merci d'avance
    Voici l'exercice:
    *)This C function performs its job most of the time, but has several defects (bugs, error handling, etc.) in specific situations.

    Modify the code to make it as robust as possible, in order to make sure it will not crash or cause any problem in the application, even if the arguments provided to the function are incorrect.
    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
    /*
      double_whitespaces:
      Copy the "msg" buffer of size "size" into the "dest" buffer,
      while doubling any blank character found in the source buffer.
    */
     
    int double_whitespaces(char *msg, int size, char *dest) {
      int ret;
      char *ptr;
     
      char *buf;
     
      buf = malloc(size);
     
      ptr = msg;
      while (ptr < msg + size) {
        if (*ptr == '%')     // % char is forbidden
          goto error;
        if (*ptr == ' ')  {
          *buf++ = ' ';
          *buf++ = ' ';
        } else {
          *buf++ = *ptr;
     
        }
        ptr++;
      }
      free(buf);
      strcpy(dest, buf);
      return 0;
    error:
      return -1;
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    J'ai un exercice en programmation C et j'ai besoin d'aide pour le résoudre .
    Comme il s'agit de ton exercice, tu dois le résoudre toi-même. Tout ce qu'on peut faire, c'est répondre à des questions portant sur les points qui posent problèmes.
    Complète ta question en montrant où tu es arrivé dans la solution et précise les difficultés qui t'arrêtent.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Quelques remarques en commentaires qui te seront peut-être utiles :
    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
    /*
      double_whitespaces:
      Copy the "msg" buffer of size "size" into the "dest" buffer,
      while doubling any blank character found in the source buffer.
    */
     
    int double_whitespaces(char *msg, int size, char *dest) {
      int ret;
      char *ptr;
     
      char *buf;
     
      buf = malloc(size);         // 1- retour de malloc non testé
                                  // 2- test de size à >0 non fait
      ptr = msg;                  // 3- test de msg != NULL non fait : 
      while (ptr < msg + size) {  //    si msg== NULL, plantage sur *ptr
        if (*ptr == '%')     // % char is forbidden
          goto error;
        if (*ptr == ' ')  {  
          *buf++ = ' ';           // 4- adresse d'allocation (buf) détruite. le free(buf) va planter. Utiliser un autre
                                  //    pointeur pbuff initialisé à buff
          *buf++ = ' ';           // 5- taille d'allocation potentiellement trop faible : écriture de deux char quelquefois 
                                  //    dans buf pour un des size char (*ptr)
        } else {
          *buf++ = *ptr;
     
        }
        ptr++;
      }
      free(buf); 
      strcpy(dest, buf);         // 6- dest à NULL non testé + remarques ci-dessous sur l'ensemble du programme    
                                 // 7- L'utilisation de strcpy() indique que le programme traite des chaines de
                                 //    caractères (terminées par 0). Dans ce cas, il est clair que size est la
                                 //    taille du buffer dest, ce qui correspond bien à la taille allouée pour buf
                                 //    Le test du while() est alors faux : Si msg est de longueur inférieure à size
                                 //    alors, on dépasse la fin de msg et le programme est faux (notamment le test
                                 //    à '%' peut arrêter la fonction sans raison) et peut planter (dépassement du buffer msg).
                                 //    Si msg est de longueur supérieure à size, alors le zéro terminal n'est pas inscrit dans buf 
                                 //    et le strcpy() est faux.
                                 //    Le test doit porter sur *ptr != '\0' ET pbuff < buff+size-1 + inscription du 0
                                 //    terminal en buff[size-1]
                                 //    Pourquoi ne pas écrire directement dans dest  et passer par buff ? Parce que la chaine
                                 //    ne doit être modifiée en cas de présence d'un '%'
     
      return 0;
    error:
      return -1;                 // 8 - fuite mémoire : pas de free(buf)
    }

Discussions similaires

  1. Recherche d'exercices de programmation Fortran
    Par feynman dans le forum Fortran
    Réponses: 2
    Dernier message: 01/09/2007, 13h24
  2. Exercice de programmation
    Par shangai3 dans le forum Pascal
    Réponses: 9
    Dernier message: 08/07/2007, 11h22
  3. [LG]Exercices de programmation
    Par belgaroui dans le forum Langage
    Réponses: 4
    Dernier message: 04/03/2005, 18h42

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