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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    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
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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
    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
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    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
    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
    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 confirmé
    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
    Par défaut Une solution
    Je suis repassé à la version 10.5 de CB et cela fonctionne
    Merci à tous

+ 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