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 :

demande d'explication sur des affichages


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut demande d'explication sur des affichages
    Bonjour,

    j'aurais besoin de vos lumières pour comprendre quelquechose.
    Dans mon code je dois afficher une chaine de caractère où je dois remplacer les caractères non imprimables par leur valeur en octal. (donc pour les char < 32 et >= 127)
    le problème est que pour des valeurs < 10 j'obtiens ce que je veux sinon ca merde

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      char str1[5];
      char str2[6];
      char str3[7];
     
      strcpy(str1, "test");
      str1[1] = 6;
      strcpy(str2, "test");
      str2[1] = 27;
      strcpy(str3, "test");
      str3[1] = 127;
      aff(str1);
      aff(str2);
      aff(str3);
    t006st
    t033st
    t17st au lieu de t177st

    ma fonction aff se resume à afficher les caractères imprimables et si jamais il y a une valeur < 32 ou >= 127 je fais appelle a ma fonction qui convertie ce nombre en octal (independament elle marche )
    A votre avi les caractères sont tronqués parce que je case dans un char un nombre à 3 digit ou il y a un bug autre part?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Montre-nous quand même tes fonctions d'affichages. Ce sera plus facile de t'aider.

    PS : 6 en octal s'écrit "06" pas "006".

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 802
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    PS : 6 en octal s'écrit "06" pas "006".
    Oui mais "006" reste correct donc autorisé...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    A mon avis si avec 6 il te mets trois digits et avec 127 il t'en met que 2, il y a un bug autre part.

    On peut voir le code?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    Selon le man ascii, j'ai ceci:

    The octal set:

    000 NUL 001 SOH 002 STX 003 ETX 004 EOT 005 ENQ 006 ACK 007 BEL
    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
     
    void       aff(int n, char *base)
    {
      long long int         deb;
      long long int         fin;
      long long int         len;
     
      len = strlen(base);
      if (n < 0)
        {
          n = (unsigned int)n;
          aff(n, base);
        }
      else
        {
          fin = n % len;
          deb = (n - fin) / len;
          if (deb != 0)
            aff(deb, base);
          printf("%c", (base[fin]));
        }
    }
    voila ma fonction d'affichage


    Citation Envoyé par coyotte507 Voir le message
    A mon avis si avec 6 il te mets trois digits et avec 127 il t'en met que 2, il y a un bug autre part.

    On peut voir le code?
    en fait quand le chiffre est inferieur a 10 jaffiche deux 0 avant, quand le chiffre est inferieur a 100 j'affiche un 0 pour afficher comme dans mon man ascii

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    j'ai du mal à comprendre le n < 0 et le fin = n%len. Aussi je ne vois nulle part où l'on teste la valeur d'un caractère pour savoir si il est inférieur à 32 ou supérieur à 127.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    j'ai du mal à comprendre le n < 0 et le fin = n%len. Aussi je ne vois nulle part où l'on teste la valeur d'un caractère pour savoir si il est inférieur à 32 ou supérieur à 127.
    cette fonction cest juste pour transformer mon nombre de base en octal et l'afficher

    pour la fonction appellante, elle est de la forme:
    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
          while (*temp)
            {
              if (*temp < 32 || *temp >= 127)
                {
                  printf("%c", '\\');
                  conv = (unsigned int)*temp;
                  if (conv < 9)
                    {
                      printf("%d", 0);
                      printf("%d", 0);
                      aff(conv, "01234567");
                    }
                  if (conv > 9 && conv < 100)
                    {
                      printf("%d", 0);
                      aff(conv, "01234567");
                    }
                  if (conv > 100)
                    {
                      aff(conv, "01234567");
                    }
                }
              printf("%c", *temp);
              temp++;
            }

  8. #8
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Ca marche très bien avec moi. J'ai juste rajouté un else dans la fonction appelante.

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void  aff(int n, char *base)
    {
      long long int         deb;
      long long int         fin;
      long long int         len;
     
      len = strlen(base);
      if (n < 0)
        {
          n = (unsigned int)n;
          aff(n, base);
        }
      else
        {
          fin = n % len;
          deb = (n - fin) / len;
          if (deb != 0)
            aff(deb, base);
          printf("%c", (base[fin]));
        }
    }
     
    int main()
    {    
    	  char tab[5] = "test";
    	  char *temp = tab;
    	  unsigned int conv;
     
    	  temp[1] = 127;
          while (*temp)
            {
              if (*temp < 32 || *temp >= 127)
                {
                  printf("%c", '\\');
                  conv = (unsigned int)*temp;
                  if (conv < 9)
                    {
                      printf("%d", 0);
                      printf("%d", 0);
                      aff(conv, "01234567");
                    }
                  if (conv > 9 && conv < 100)
                    {
                      printf("%d", 0);
                      aff(conv, "01234567");
                    }
                  if (conv > 100)
                    {
                      aff(conv, "01234567");
                    }
                } else
              		printf("%c", *temp);
              ++temp;
            }
            printf("\n");
            return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/10/2006, 22h12
  2. Réponses: 3
    Dernier message: 27/09/2006, 13h11
  3. Explication sur des balises
    Par Gandalf5975 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/07/2006, 16h18
  4. [C#] demande d'explication sur un sample msdn
    Par legillou dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/06/2006, 17h01
  5. [final]demande d'explication sur ce mot-clé
    Par Invité dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 11h32

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