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 printf et \n


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 112
    Points : 98
    Points
    98
    Par défaut Problème printf et \n
    Bonjour à tous.
    D'abord mon environnement w7+codeblocks+mingw32
    Voici un petit programme qui fonctionne:
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main(int argc, char *argv[])
    {   
        int i;
        char *adr;
        adr="123456789";
        for(i=0; i<10; i++)
        {
            printf("%c\n",adr[i]);
        }
        return 0;
     
    }
    Le problème est :Si je supprime le \n dans le printf la compile se passe bien mais la fenêtre de console n'affiche que la ligne process returned....
    Si je mets un printf("bo"); par exemple ,(bizarre ,il faut que le mot est au moins deux caractères), dans le code en amont le pb ne se pose plus,je peux supprimer le \n
    Qu'en pensez vous ?
    Merci de m'avoir consacré de votre temps

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    En général le flux de sortie est bufférisé.
    Si tu ne forces pas l'écriture il est possible que les données restent dans le buffer et ne soit pas réellement écrites.

    Pour que les données soient affichées, il faut :
    • Soit utiliser fflush(stdout) pour forcer l'affichage du contenu du buffer.
    • Soit utiliser un "\n" qui va forcer l'écriture du buffer (c'est spécifique à stdout et stderr)
    • Soit que le buffer ait atteint une certaine taille (taille qui peut varier selon plein de critères comme le système, le compilateur, etc.).
      c'est sûrement la raison du printf("bo") qui fait "marcher" ton code...




    En clair si tu veux supprimer les "\n" dans la boucle, rajoute un printf("\n") ou un fflush(stdout) avant la fin de ton programme...

    a++

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Pour que les données soient affichées, il faut :
    • Soit utiliser fflush(stdout) pour forcer l'affichage du contenu du buffer.
    • Soit utiliser un "\n" qui va forcer l'écriture du buffer (c'est spécifique à stdout et stderr)
    • Soit que le buffer ait atteint une certaine taille (taille qui peut varier selon plein de critères comme le système, le compilateur, etc.).
      c'est sûrement la raison du printf("bo") qui fait "marcher" ton code...
    La fermeture du FILE * vide aussi le buffer.
    Mais cela m'étonne que Windows ne flush pas stdout lors d'une sortie sans erreur d'un programme.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    La fermeture du FILE * vide aussi le buffer.
    En effet.
    J'ai pas pensé à lui car on ferme rarement stdout

    Citation Envoyé par Neckara Voir le message
    Mais cela m'étonne que Windows ne flush pas stdout lors d'une sortie sans erreur d'un programme.
    C'est le genre de comportement qui peut dépendre de plein de chose, comme l'OS ou le compilateur...

    Donc perso cela ne m'étonne pas vraiment...

    a++

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 632
    Points
    23 632
    Par défaut
    Hello,

    Citation Envoyé par adiGuba Voir le message
    C'est le genre de comportement qui peut dépendre de plein de chose, comme l'OS ou le compilateur...
    Euh non, tout de même, le vidage sur fermeture d'un fichier est quand même quelque chose que l'on est en droit d'attendre de toute implémentation qui se respecte. Et cela est même précisé clairement par la norme :


    §5.1.2.2.3 Program termination

    1. If the return type of the main function is a type compatible with int, a return from the
    initial call to the main function is equivalent to calling the exit function with the value
    returned by the main function as its argument;10) reaching the } that terminates the
    main function returns a value of 0. If the return type is not compatible with int, the
    termination status returned to the host environment is unspecified.
    §7.20.4.3 The exit function

    4. Next, all open streams with unwritten buffered data are flushed, all open streams are
    closed, and all files created by the tmpfile function are removed.
    §7.19.3 Files

    4. A file may be disassociated from a controlling stream by closing the file. Output streams
    are flushed (any unwritten buffer contents are transmitted to the host environment) before
    the stream is disassociated from the file. The value of a pointer to a FILE object is
    indeterminate after the associated file is closed (including the standard text streams).
    Whether a file of zero length (on which no characters have been written by an output
    stream) actually exists is implementation-defined.

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    @Obsidian : je suis d'accord avec toi : c'est dans la norme.
    C'est juste que je ne serais pas vraiment étonné que le compilateur en question ne respecte pas cette norme...


    [edit] Il peut y avoir une autre explication : le shell peut faire un retour en début de ligne (\t) et ainsi "écraser" les quelques caractères affichés à l'écran...


    a++

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 112
    Points : 98
    Points
    98
    Par défaut Une solution
    Je suis repassé à la version 10.5 de CB et cela fonctionne
    Merci à tous

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 632
    Points
    23 632
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    [edit] Il peut y avoir une autre explication : le shell peut faire un retour en début de ligne (\t) et ainsi "écraser" les quelques caractères affichés à l'écran..
    C'est à cela que je pense également, et c'est un cas de figure déjà nettement plus courant. :-)

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    [edit] Il peut y avoir une autre explication : le shell peut faire un retour en début de ligne (\t) et ainsi "écraser" les quelques caractères affichés à l'écran...
    \r plutôt non?

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    \r plutôt non?
    En fait je pensait plutôt à \f... mais j'avoue ne plus être sûr du tout (ca fait longtemps que je n'ai plus manipulé tout cela)...


    a++

  11. #11
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    \r = carrier return (on revient au début de la ligne courante/retour chariot)
    \n = linefeed/newline (on avance d'1 ligne exactement/déplacement en bas)

    C'est bien le \r auquel tu pensais qui est rajouté en effet par le shell dans certains cas comme le dis Neckara !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  12. #12
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Metalman Voir le message
    C'est bien le \r auquel tu pensais qui est rajouté en effet par le shell dans certains cas comme le dis Neckara !
    En effet oui j'ai confondus. C'est vieux tout çà

    Le \f semble effacer l'écran.

    a++

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 632
    Points
    23 632
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Le \f semble effacer l'écran.
    Plus précisément, « /f » correspond à « Form Feed » (soit « alimentation avec un feuillet, ou formulaire »). C'est un caractère du code ASCII qui sert littéralement à éjecter la feuille en cours d'une imprimante et avancer au début de la suivante, spécialement quand l'alimentation en papier d'une imprimante se fait en continu (avec des rouleaux à picots), mais pas nécessairement.

    C'est un code qui est toujours reconnu. L'envoyer à une imprimante actuelle éjectera toujours la page pourvu que ladite imprimante soit toujours capable de traiter un flux de texte brut. Mais c'était déjà nécessaire sur les machines qui n'utilisaient pas de tube cathodique comme moniteur et qui communiquait à travers un téléscripteur.

    Sur des moniteurs, justement, l'action équivalente à avancer en début de la page suivante consiste à effacer entièrement l'écran et à repositionner le curseur en haut à gauche. C'est ce qui se passe notamment sur les terminaux Vidéotex ou compatible (par exemple le Minitel et les ordinateurs Thomson).

    À noter que ce caractère est le numéro 12 et qu'il correspond donc à Ctrl-L. Taper « Ctrl-L » sur un Minitel efface donc l'écran, mais c'est aussi pour cela qu'on peut aussi le faire depuis un Shell Unix, bien que le cheminement soit un peu moins direct (le Shell l'interprète comme une sollicitation de l'utilisateur et nettoie l'écran, que celui-ci soit compatible ou non).

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Metalman Voir le message
    C'est bien le \r auquel tu pensais qui est rajouté en effet par le shell dans certains cas comme le dis Neckara !
    Sauf que \r n'efface pas la ligne en cours, elle repositionne juste le curseur en début de ligne.

    Voir l'effet du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdint.h>
     
    int main(void)
    {
        printf("toto");
        putchar('\r');
        putchar('J');
        return 0;
    }

  15. #15
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Oui... c'est pour ça que je l'ai écrit d'ailleurs !
    \r = carrier return (on revient au début de la ligne courante/retour chariot)
    Je n'ai pas parlé d'effacer la ligne !
    L'effacement se fait avec le \n qui remplit d'espaces 1 ligne exactement quand on joue avec le mode canonique.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

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

Discussions similaires

  1. problème de printf d'un chaîne de caractère
    Par beb1982 dans le forum Débuter
    Réponses: 8
    Dernier message: 01/10/2007, 11h45
  2. Problème de printf sans retour chariot \n
    Par Acivurt dans le forum Débuter
    Réponses: 8
    Dernier message: 24/07/2007, 13h17
  3. Problème de printf
    Par Milowen dans le forum C
    Réponses: 2
    Dernier message: 02/09/2005, 17h07
  4. problème d'affichage avec printf
    Par sorari dans le forum C++
    Réponses: 12
    Dernier message: 08/03/2005, 18h30
  5. Problème a l'affichage dans la console (printf)
    Par PhoneKilleR dans le forum C
    Réponses: 21
    Dernier message: 23/09/2003, 17h21

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