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 :

Ecrire Gérard en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Par défaut Ecrire Gérard en C
    Bonjour,

    Je suis sous windows 10,
    j'utilise NotePad++ pour écrire mes programmes en C,
    je compile avec GCC sous MinGW_W64. dans une fenêtre console windows

    Mon programme est simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
      printf("Bonjour Gérard"); 
      return 0;
    }
    Mais j'obtiens G-|rard au lieu de Gérard.

    J'ai bien compris que c'est un caractère ASCII supérieur à 127, mais, je pense, que je dois utiliser une autre Bibliothèque que stdio.h, mais laquelle ?
    Peut-être aussi, dois-je utiliser une autre instruction que "printf" ?

    Enfin, autre question, comment connaître toutes les commandes que contient stdio.h et une librairie en général...

    Merci de votre réponse.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Non pas totalement :

    Déjà il faut passer par de l'unicode avec le type wchar_t et toutes les fonctions spécifiques comme wprintf, wcslen, ... dans l'entête wchar.h (<- lien)

    Et ensuite, la console/ ligne de commandes Windows affiche un code page OEM. Il faut utiliser la commande chcp avec soit 65001 (UTF-8) soit 1200/ 1201 (UTF-16) soit 12000/ 12001 (UTF-32) : Code Page Identifiers (<- lien msdn)


    Citation Envoyé par papilou86 Voir le message
    Enfin, autre question, comment connaître toutes les commandes que contient stdio.h et une librairie en général...
    stdio.h (<- lien)

    À gauche, en haut, tu as la liste des entêtes.
    Sinon, il faut regarder le code source.

  3. #3
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 788
    Par défaut
    Hello,
    Autre solution, sans passer par la commande chcp:
    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
    #include <windows.h>
     
    #define LATIN1	1252
     
    static unsigned int initialCP;
     
    unsigned int setConsoleLatin1(void) {
    	if(initialCP==0)
    		initialCP=GetConsoleOutputCP();
    	SetConsoleCP(LATIN1);
    	SetConsoleOutputCP(LATIN1);
    	return(initialCP);
    }
     
    void restoreConsoleCP(void) {
    	if(initialCP>0) {
    		SetConsoleCP(initialCP);
    		SetConsoleOutputCP(initialCP);
    	}
    }
    à mettre dans un .c à part....

  4. #4
    Membre très actif
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Par défaut
    Merci foetus

    j'ai donc fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
     
     
    int main()
    {
      wprintf("Bonjour Gérard");
      return 0;
    }
    Puis j'ai ouvert ma console Windows (cmd)
    la, j'ai tapé chpc 65001

    puis j'ai compilé mon programme C (essai1.c)

    et j'ai l'erreur suivante :
    essai1.c: In function 'main':
    essai1.c:21:11: warning: passing argument 1 of 'wprintf' from incompatible pointer type [-Wincompatible-pointer-types]
    wprintf("Bonjour G├®rard"); // Cette instruction affiche Bonjour ├á l'├®cran
    ^~~~~~~~~~~~~~~~~
    In file included from essai1.c:9:0:
    C:/Program Files (x86)/mingw-w64/i686-7.2.0-posix-dwarf-rt_v5-rev1/mingw32/i686-w64-mingw32/include/stdio.h:772:15: note: expected 'const wchar_t * restrict {aka const short unsigned int * restrict}' but argument is of type 'char *'
    int __cdecl wprintf(const wchar_t * __restrict__ _Format,...);

  5. #5
    Membre très actif
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Par défaut
    Pour edgarjacobs

    Merci de ta réponse, mais je ne comprends pas ce que je dois faire de la fonction que tu me donnes.
    j'en fait un .c a part ok.
    Mais ensuite, j'en fait quoi ?
    Merci

    Peux tu me donner un exemple simple ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    C'est normal : lis la documentation.
    La fonction wprintf prend en paramètre un tableau de wchar_t c'est L"Bonjour Gérard" (<- note le L majuscule en premier )

    Et ensuite, pour le code de edgarjacobs, il faut appeler au tout début setConsoleLatin1 et à la toute fin restoreConsoleCP.
    Mais évidement, il faut modifier un peu pour avoir setConsoleUTF-16


    Et ensuite pour le code en UTF-8 c'est
    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
    #include <stdio.h>
     
     
    int main (int argc, char* argv[])
    {
        unsigned char chinese_char[] = {0x20, 0xE5, 0xA4, 0xA7, 0xE5, 0xAE, 0xB6, 0x2C, 0x20, 0xE8, 0xB0, 0xA2, 0xE8, 0xB0, 0xA2, 0x21, 0x00};
        unsigned char russian_char[] = {0xD0, 0xA0, 0xD1, 0x83, 0xD1, 0x81, 0xD1, 0x81, 0xD0, 0xBA, 0xD0, 0xB0, 0xD1, 0x8F, 0x20, 0x41, 0x5A, 0x45, 0x52, 0x54,
                      0x59, 0x20, 0xD0, 0xBA, 0xD0, 0xBB, 0xD0, 0xB0, 0xD0, 0xB2, 0xD0, 0xB8, 0xD0, 0xB0, 0xD1, 0x82, 0xD1, 0x83, 0xD1, 0x80, 0xD0, 0xB0, 0x00};
     
        printf("%s\n\n%s\n\n", chinese_char, russian_char);
     
        printf("Vous avez pass\u00E9 en tout %d param\u00E8tres sur la ligne de commande.\n", argc);
     
        printf("Bonjour G\u00E9rard");
     
     
        return 0;
    }

  7. #7
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 788
    Par défaut
    Re,-

    Exemple simple, sans .c à part:
    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
    #include <stdio.h>
    #include <windows.h>
     
    #define LATIN1	1252
     
    static unsigned int initialCP;
     
    unsigned int setConsoleLatin1(void) {
    	if(initialCP==0)
    		initialCP=GetConsoleOutputCP();
    	SetConsoleCP(LATIN1);
    	SetConsoleOutputCP(LATIN1);
    	return(initialCP);
    }
     
    void restoreConsoleCP(void) {
    	if(initialCP>0) {
    		SetConsoleCP(initialCP);
    		SetConsoleOutputCP(initialCP);
    	}
    }
     
    int main(void) {
    	setConsoleLatin1();
    	puts("Hello Gérard - éèçàù\n");
    	restoreConsoleCP();
    	puts("Hello Gérard - éèçàù\n");
     
    	return(0);
    }

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

Discussions similaires

  1. [LG]Ecrire le contenu d'un fichier dans un autre
    Par lucke dans le forum Langage
    Réponses: 10
    Dernier message: 26/04/2003, 20h48
  2. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44
  3. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54
  4. [VB6] Ecrire à un endroit précis d'un richtextbox
    Par STG dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 26/11/2002, 14h35
  5. ecrire son OS (assembleur ??)
    Par Anonymous dans le forum Programmation d'OS
    Réponses: 9
    Dernier message: 25/11/2002, 19h25

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