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 :

[linux] mettre des zéros devant un nombre [Tutoriel]


Sujet :

C

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut [linux] mettre des zéros devant un nombre
    Bon, je profite que je suis lancé. Voilà mon problème : Je dois inscrire dans un fichier des nombres allant disons de 1 à 25. Mais je voudrais qu'il m'affiche 01, 02, 03, ... jusqu'à 25 (en gros je veux deux chiffres). Le but étant de pouvoir retransformer la chaîne de caractètes en un nombre avec la fonction sscanf.
    Mais déjà, sans passer par le fichier, j'ai un problème. Voilà le bout de code qui me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // KEYCODE=1
    sprintf(buffer,"%2d",KEYCODE);
    // en affichant buffer j'obtiens un espace puis le chiffre 1 et pas 01
    sscanf(buffer,"%d",key);
    // de ce fait, sscanf me plante un segmentation fault.
    Voilà, si quelqu'un a la solution a mon problème, ça serait sympa parce que j'ai essayé avec les hexadécimaux et les flottants, c'est tjs le même problème, même en mettant %2d à sscanf, j'ai tjs un SegFault .....

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [linux] mettre des zéros devant un nombre
    Citation Envoyé par le mage tophinus
    Voilà mon problème : Je dois inscrire dans un fichier des nombres allant disons de 1 à 25. Mais je voudrais qu'il m'affiche 01, 02, 03, ... jusqu'à 25 (en gros je veux deux chiffres). Le but étant de pouvoir retransformer la chaîne de caractètes en un nombre avec la fonction sscanf.
    *printf() avec "%02d" comme indiqué dans ton livre de C...

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Merci encore
    PS : Mon livre de C, il est pas top. J'ai eu déjà enormément de mal à trouver comment faire un flottant vu qu'il ne précise pas comment faire. Heureusement qu'il y a le cours de C-linux en ligne sur le forum

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Euh, je crois que j'ai résolu trop vite .... ça m'affiche bien le zéro mais j'ai toujours un problème avec le sscanf que ça soit avec "%d", "%02d" ou "%2d" .... désolé
    Par contre l'affichage marche impec

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par le mage tophinus
    Heureusement qu'il y a le cours de C-linux en ligne sur le forum
    Je serais toi, je ne mélangerais pas le C standard et la programmation Linux pour l'instant...
    • Apprendre le langage C est une chose (qui ne dépend pas de la machine ni du système)
    • Apprendre à écrire des applications spécifiques à Linux est autre chose.

    Apprendre à les différencier dès le début me parait important pour la suite...

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par le mage tophinus
    j'ai toujours un problème avec le sscanf que ça soit avec "%d", "%02d" ou "%2d"
    Montre le code exact, complet et compilable qui ne fonctionne pas.

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Il est un peu log le code alors je mets l'essentiel :

    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 <curses.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #define KEYCODE 01
     
    WINDOW *messagebar;
     
    void convertir_donnees();
    {
        char buffer[80];
        FILE* fd;
        int key, i;
     
        fd=fopen("/home/toph/init","r");
        sprintf(buffer,"k[%02d]=%03d\n",KEYCODE,KEY_F(1));
        fwrite(buffer,1,10,fd);
        sprintf(buffer,"%02d",KEYCODE);
        print_message(buffer);
        i=getch();
        sscanf(buffer,"%2d",key);
        i=getch();
        close(fd);
    }
     
    void print_message(char *input_message)
    {
      werase(messagebar);
      wprintw(messagebar,"%s",input_message);
      wrefresh(messagebar);
      // be careful that cursor is not at this place after this !!!
    }
    Voilà. J'ai bien la première attente de pression d'une touche avec getch, il m'affiche bien 01 mais j'ai pas l'attente de la deuxième pression de la touche, j'ai le seg fault à la place....

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par le mage tophinus
    Il est un peu log le code alors je mets l'essentiel
    Non. L'essentiel qui montre le défaut, c'est ça :
    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
     
    #include <stdio.h>
    #define KEYCODE 01
     
    #define print_message(s) puts(s)
     
    static void convertir_donnees (void)
    {
       char buffer[80];
       int key;
       sprintf (buffer, "%02d", KEYCODE);
       print_message (buffer);
       sscanf (buffer, "%2d", key);
    }
     
    int main (void)
    {
       convertir_donnees ();
     
       return 0;
    }
    Qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ../main.c: In function `convertir_donnees':
     
    ../main.c:12: warning: format argument is not a pointer (arg 3)
    ../main.c:9: warning: 'key' might be used uninitialized in this function
    Et là, on voit bien qu'il y a un comportement indéfini...

    sscanf() avec "%d" attend l'adresse d'un int. Il manque un &.

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Merci beaucoup. Et je viens de trouver une nouvelle erreur grâce à ça. Je croyais compiler avec l'option -Wall mais pas du tout, c'est pour ça que je trouvais pas le problème... Ce que je cromprends pas c'est pourquoi mon Makefile ne va pas ....
    Tu pourrais m'aider une dernière fois STP. Voilà le Makefile à la racine :
    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
     
    CC=gcc
    AR=ar
    CFLAGS=-Wall
    LDFLAGS=-Wall -lcurses
    EXEC=cucc
     
     
    all: $(EXEC)
     
    $(EXEC): main.o interface/interface.a init/init.o
    	$(CC) -o $@ $^ $(LDFLAGS)
     
    main.o: main.c
    	$(CC) -o $@ -c $< $(CFLAGS)
     
    interface/interface.a:
    	@export CC
    	@export AR
    	@export CFLAGS
    	@(cd interface && $(MAKE))
     
    init/init.o:
    	@export CC
    	@export AR
    	@export CFLAGS
    	@(cd init && $(MAKE))
     
    clean:
    	rm -rf main.o
    	@(cd interface && $(MAKE) $@)
    	@(cd init && $(MAKE) $@)
     
    mrproper: clean
    	rm -rf cucc
    Et dans le répertoire init (qui contient les fichiers init.c et init.h, ceux qui me posaient problème...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    all: init.o
     
    init.o: init.c init.h
    	gcc -o $@ -c $< $(CFLAGS)
     
    clean:
    	rm -rf *.o
    Pourtant c'est ce qui est fait dans le tutoriel du Makefile (partie 10.sous-makefile) :
    http://gl.developpez.com/tutoriel/outil/makefile/

    Et là je remarque qu'en changeant $(CFLAGS) par -Wall, j'ai bien le warning que tu as trouvé, et en mettant $(CC), j'ai cc comme compilateur et non gcc, donc mes exports ne sont pas bons .....

    Il est où mon problème ....

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par le mage tophinus
    Merci beaucoup. Et je viens de trouver une nouvelle erreur grâce à ça. Je croyais compiler avec l'option -Wall mais pas du tout, c'est pour ça que je trouvais pas le problème... Ce que je cromprends pas c'est pourquoi mon Makefile ne va pas ....
    Tu pourrais m'aider une dernière fois STP. Voilà le Makefile à la racine :
    Gni ? Quel rapport avec le langage C ?

    Mauvais forum. Je rappelle l'existence du forum "Outils pour C & C++ / EDI / Compilateurs / etc"

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Bin, si tu savais, ça aurait été plus vite, c'est tout et comme le Makefile était en rapport avec gcc c'est pour ça que je pensais que ça avait rapport avec le C, je connaissais pas l'autre forum. Tant pis...

    Mais tout de même, un grand pour ton aide

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par le mage tophinus
    Pourtant c'est ce qui est fait dans le tutoriel du Makefile (partie 10.sous-makefile) :
    http://gl.developpez.com/tutoriel/outil/makefile/

    Et là je remarque qu'en changeant $(CFLAGS) par -Wall, j'ai bien le warning que tu as trouvé, et en mettant $(CC), j'ai cc comme compilateur et non gcc, donc mes exports ne sont pas bons .....
    Il y a effetivement un petit probleme dans le tutoriel, j'ai oublie la moitie de certaines lignes. Le makefile principal etant :

    CC=gcc
    CFLAGS=-Wall -ansi
    LDFLAGS=-Wall -ansi
    HELLO_DIR=hello
    EXEC=$(HELLO_DIR)/hello

    all: $(EXEC)

    $(EXEC):
    @export CC="$(CC)"
    @export CFLAGS="$(CFLAGS)"
    @export LDFLAGS="$(LDFLAGS)"
    @(cd $(HELLO_DIR) && $(MAKE))

    .PHONY: clean mrproper $(EXEC)

    clean:
    @(cd $(HELLO_DIR) && $(MAKE) $@)

    mrproper: clean
    @(cd $(HELLO_DIR) && $(MAKE) $@)
    Par contre, je viens de noter un autre petit probleme : si les variables d'environnement existe, elles sont bien mises a jour durant l'execution du makefile lors de l'export, par contre si elles n'existent pas, elles ne sont pas creees. Je vais creuser ce probleme et mettre a jour le tutoriel.

  13. #13
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Merci beaucoup pour la correction du tutoriel et surtout le tutoriel

    Par contre, je viens de noter un autre petit probleme : si les variables d'environnement existe, elles sont bien mises a jour durant l'execution du makefile lors de l'export, par contre si elles n'existent pas, elles ne sont pas creees. Je vais creuser ce probleme et mettre a jour le tutoriel.
    Ne serait-it pas mieux dans ce cas, d'inclure le Makefile du répertoire fils dans le makefile du répertoire père. Dans ce cas, on passerait outre les problèmes d'export ? c'est juste une solution de secours, je suis pas sûr que ça soit intéressant au final, j'en connais pas encore suffisamment sur le sujet

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    A priori ca vient du fait que chaque ligne du Makefile soit execute dans un shell différent.

    ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(EXEC):
    	@(export CC="$(CC)" && export CFLAGS="$(CFLAGS)" && export LDFLAGS="$(LDFLAGS)" && cd $(HELLO_DIR) && $(MAKE))
    semble correctement fonctionner.

    Mais j'avoue que je n'arrive pas a comprendre pourquoi si la variable existe sa valeur est modifiee mais que si elle n'existe pas l'export est sans effet. Ce n'est pas tres coherent.
    Si quelqu'un a une explication je suis preneur

  15. #15
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par gl
    Mais j'avoue que je n'arrive pas a comprendre pourquoi si la variable existe sa valeur est modifiee mais que si elle n'existe pas l'export est sans effet. Ce n'est pas tres coherent.
    Si quelqu'un a une explication je suis preneur
    Si la variable est déjà existante, tous les processus lancés depuis le make auront la visibilité de cette variable. Si elle n'existe pas, elle ne sera exportée que pour le shell fils (qui sera donc le seul a en connaitre l'existence et la valeur...)

  16. #16
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Bon, je viens d'essayer chez moi et la méthode :
    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
     
    CC=gcc
    CFLAGS=-Wall -ansi
    LDFLAGS=-Wall -ansi
    HELLO_DIR=hello
    EXEC=$(HELLO_DIR)/hello
     
    all: $(EXEC)
     
    $(EXEC):
    @export CC="$(CC)"
    @export CFLAGS="$(CFLAGS)"
    @export LDFLAGS="$(LDFLAGS)"
    @(cd $(HELLO_DIR) && $(MAKE))
     
    .PHONY: clean mrproper $(EXEC)
     
    clean:
    @(cd $(HELLO_DIR) && $(MAKE) $@)
     
    mrproper: clean
    @(cd $(HELLO_DIR) && $(MAKE) $@)
    ça ne fonctionne pas chez moi. Je suppose que c'est parce que la variable n'existe pas avant chez moi.
    Alors, j'ai réfléchi et j'ai fait ça :
    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
     
    export CC=gcc
    export CFLAGS=-Wall -ansi
    export LDFLAGS=-Wall -ansi
    HELLO_DIR=hello
    EXEC=$(HELLO_DIR)/hello
     
    all: $(EXEC)
     
    $(EXEC):
    @(cd $(HELLO_DIR) && $(MAKE))
     
    .PHONY: clean mrproper $(EXEC)
     
    clean:
    @(cd $(HELLO_DIR) && $(MAKE) $@)
     
    mrproper: clean
    @(cd $(HELLO_DIR) && $(MAKE) $@)
    Et il n'y a que ça qui marche chez moi. Je ne dois pas mettre non plus le @ devant export sinon ça ne marche plus. En gros, il faut exporter la variable au moment de sa création ..... Et ça marche même avec les variables inexistantes à l'origine. Il faut aussi remarquer que ces variables sont vides après le make. Mais d'après ce qu'a dit Pouic, je crois que c'est normal .........

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

Discussions similaires

  1. [AC-2013] Mettre des zéros devant un chiffre
    Par jejelogeal dans le forum Modélisation
    Réponses: 3
    Dernier message: 29/01/2015, 07h15
  2. [DATA] Format z : mettre des zéros devant un caractère
    Par logiclogic dans le forum SAS Base
    Réponses: 10
    Dernier message: 25/04/2013, 17h28
  3. [Conception] Ajouter des "0" devant un nombre
    Par xender dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 18/01/2012, 16h19
  4. ajouter des zéro devant un nombre décimal
    Par les4c77 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/02/2010, 17h22
  5. Ajouter un zéro devant un nombre
    Par solorac dans le forum Excel
    Réponses: 1
    Dernier message: 07/06/2007, 11h15

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