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 :

Lire une chaine par la fin


Sujet :

C

  1. #1
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut Lire une chaine par la fin
    Bonjour à tous !

    J'aimerais savoir si il est possible (via une fonction ou non) de lire une chaine de caractère à partir de la fin ?!

    En fait j'aimerais coder une fonction qui supprime les zéros inutiles à la fin d'un nombre. Pour cela, j'aurais voulu lire ce nombre (convertis en chaine de caractère) à partir de la fin, trouver le premier caractère qui n'est pas égal à '0' ou ',' et effacer tout ce qui a été lu avant et renvoyer le nombre de départ ainsi simplifier !

    Merci d'avance !

  2. #2
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    bien sûr ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    l = strlen(chaine) ;
     
    for ( i = (l-1) ; i >= 0 ; i-- )
       if ( chaine[i] == '0' )
          chaine[i] = ' ' ;

  3. #3
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Je ne suis pas sur de bien comprendre.. Tu veux supprimer les 0 à la fin d'une chaine convertie d'un nombre ? Donc un nombre comme 5000 deviendrait 5 ?

  4. #4
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut
    En fait j'utiliserai ma fonction après un calcul entre deux doubles (ou tout autre type acceptant les nombres décimaux). Je supprimerai tout ce qui a été lu dès que le caractère trouvé sera différent de '0' ou de '.'
    Cela donnera donc par exemple :

    5 / 2 = 2.50000 -> fonction -> 2.5
    5 x 2 = 10.0000 -> fonction -> 10


  5. #5
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Je pense qu'il y a plus simple pour ce que tu essayes de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int main(void)
    {
            char resultat[15] = {0};
     
            sprintf(resultat, "%g", 5.0 / 2.0);
            fprintf(stderr, "Resultat : %s\n", resultat);
     
            return 0;
    }
    Citation Envoyé par man sprintf Feisty fawn
    g, G L’argument réel, de type double, est converti en style f ou e (ou F ou E pour la conversion G) La précision indique le nombre de décimales significatives. Si
    la précision est absente, une valeur par défaut de 6 est utilisée. Si la précision vaut 0, elle est considérée comme valant 1. La notation scientifique e est
    utilisée si l’exposant est inférieur à -4 ou supérieur ou égal à la précision demandée. Les zéros en fin de partie décimale sont supprimés. Un point décimal
    n’est affiché que s’il est suivi d’au moins un chiffre.

  6. #6
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut
    Ce que je voudrais en fait c'est pouvoir faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    long a = 5;
    long b = 2;
    long resultat = 0;
     
    resultat = a / b;
     
    sup_zero(resultat);
     
    printf("ld", resultat);
    J'ai essayé de coderpar étapes la fonction qui permet cela et dès le début j'ai un problème !
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void sup_zero (char const *chaine)
    {
        int l;
        int i;
     
        l = strlen(chaine);
     
        for ( i = (l-1) ; i >= 0 ; i-- )
        {
            if ( chaine[i] == '0' )
            {
            chaine[i] = ' ';
            }
        }   
    }
     
     
    int main(int argc, char *argv[])
    {
        char chaine [] = "2.50000";
     
        sup_zero(chaine);
     
        printf("%s", chaine);
     
      getch();	
      return 0;
    }

  7. #7
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Ce que tu ne comprends pas c'est que l'affichage des 0 à la fin du nombre n'est que le formatage de ce nombre sur la sortie standard. En mathématiques, 2.5 est égal à 2.50 comme à 2.50000000.

    En outre, tu dis
    Citation Envoyé par Electroniktor
    Ce que je voudrais en fait c'est pouvoir faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    long resultat = 0;
    
    resultat = a / b;
    
    sup_zero(resultat);
    et dans ton main tu mets
    Citation Envoyé par Electroniktor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(int argc, char *argv[])
    {
        char chaine [] = "2.50000";
        
        sup_zero(chaine);
    }
    Alors tu veux faire quoi au final? convertir une chaine en double? Pour cela tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(chaine, "%ld", &tonDouble)

  8. #8
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Pour la fonction c'est normal, d'abord tu déclares un tableau alors que c'est une chaîne, et ensuite tu la déclares const..

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void sup_zero (char *chaine)
    {
        int l;
        int i;
     
        l = strlen(chaine);
     
        for ( i = (l-1) ; i >= 0 ; i-- )
        {
            if ( chaine[i] == '0' )
            {
            chaine[i] = ' ';
            }
        }   
    }
     
     
    int main(int argc, char *argv[])
    {
        char *chaine = "2.50000";
     
        sup_zero(chaine);
     
        printf("%s", chaine);
     
      getch();	
      return 0;
    }
    Marche très bien.

    Ensuite pour faire ce que tu veux, comme a dit muad'dib le format %g dans le printf permet exactement ça...

  9. #9
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par souviron34
    Pour la fonction c'est normal, d'abord tu déclares un tableau alors que c'est une chaîne, et ensuite tu la déclares const..

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void sup_zero (char *chaine)
    {
        int l;
        int i;
        
        l = strlen(chaine);
     
        for ( i = (l-1) ; i >= 0 ; i-- )
        {
            if ( chaine[i] == '0' )
            {
            chaine[i] = ' ';
            }
        }   
    }
          
     
    int main(int argc, char *argv[])
    {
        char *chaine = "2.50000";
        
        sup_zero(chaine);
        
        printf("%s", chaine);
      
      getch();	
      return 0;
    }
    Marche très bien.
    Attention quand même, il y a de grande chance que ça plante.... Ici, "chaine" a toute les chances de pointer dans une zone en lecture seule. Donc l'appel de sup_zero() peut crasher.
    La déclaration suivante est préférable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chaine[] = "2.50000";

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

Discussions similaires

  1. [Système] Remplacer une chaine par un lien hypertexte
    Par Bisûnûrs dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 10h34
  2. remplacement d'une chaine par une autre
    Par zalalus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/07/2006, 11h09
  3. Réponses: 6
    Dernier message: 29/11/2005, 17h40
  4. [Property] Comment déclarer une chaine par defaut ?
    Par Clorish dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/09/2004, 23h11
  5. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 06h37

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