Un char sur plus de 8 bits en C ??
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Un char sur plus de 8 bits en C ??



  1. #1
    fiatlux

    Un char sur plus de 8 bits en C ??


    ------

    Bonjour

    Je testais le programme suivant:
    Code:
    #include <stdio.h>
    
    main() {
       char c;
       c = getchar();  
       while (c != EOF) {
          putchar(c); 
          c = getchar();
       } 
    }
    Et lorsque je l'exécute et je tape par exemple "coucou", il est censé stocker "coucou" sur un char ?? Parce que ça a l'air de marcher puisqu'ensuite avec putchar il m'affiche "coucou". Les char c'est pas censé être stocké sur 8 bits?... donc 1 caractère par "char".

    Merci d'avance

    -----
    La pie niche-t-elle haut ? Oui, la pie niche haut.

  2. #2
    Paraboloide_Hyperbolique

    Re : Un char sur plus de 8 bits en C ??

    Oui, un char est codé sur 8 bits (1 octet).

    A chaque appel de putchar(c), la fonction incrémente un pointeur interne vers la position suivante en mémoire (le pointeur pointant initialement sur la première lettre du mot que vous avez entré en mémoire).

    getchar lit met alors dans c le contenu du pointeur qui a été incrémenté, à savoir la lettre suivante de votre mot.

    Pour moi, cette manière de programmer n'est pas recommandable car, avec ce code (en le modifiant très légèrement), vous pouvez facilement commencer à lire les données de votre programme ou d'autres programmes (dépassement mémoire). Il est même possible de corrompre la mémoire vive et de faire planter le système d'exploitation (de quoi avoir un début de virus informatique).

  3. #3
    fiatlux

    Re : Un char sur plus de 8 bits en C ??

    Merci de la réponse. Donc si j'ai bien compris:
    Quand j'écris "coucou" au moment où c=getchar() s'exécute:
    Dans c j'ai la valeur sur 8 bits (valeur ascii) de la lettre c et getchar() met l'adresse de cette valeur dans un pointeur interne.
    Puis putchar lit l'adresse du pointeur (c'est donc un pointeur COMMUN à getchar et putchar?? c'est possible, ça?) et va lire la valeur stockée à ladite adresse. Mais comment est-ce qu'elle passe aussi aux lettre suivantes "oucou" ? Et où est-ce qu'elles sont stockées, elles, juste derrière "c" dans la mémoire?
    Désolé mais c'est un peu flou pour moi.
    La pie niche-t-elle haut ? Oui, la pie niche haut.

  4. #4
    invite2d7144a7

    Re : Un char sur plus de 8 bits en C ??

    Bonjour,

    Elles sont stockées à la même adresse, en écrasant la valeur précédente.

  5. A voir en vidéo sur Futura
  6. #5
    fiatlux

    Re : Un char sur plus de 8 bits en C ??

    Ouais mais.....comment c'est possible? Je veux dire il faudrait dans ce cas que getchar et putchar fonctionne en alternance, genre:
    on stocke "c"
    putchar affiche "c"
    on écrase "c" et on stocke "o"
    putchar affiche "o"
    etc
    ...??
    Et donc il y a bien un "pointeur commun" entre putchar et getchar ?
    La pie niche-t-elle haut ? Oui, la pie niche haut.

  7. #6
    Paraboloide_Hyperbolique

    Re : Un char sur plus de 8 bits en C ??

    Je ne puis être catégorique là-dessus dans le cas qui nous occupe, mais je pense que c'est le cas.

    Pour avoir farfouillé dedans, je sais que les bibliothèques C et C++ contiennent fréquement des variables (pointeurs mémoires et autres) qui ne sont pas directement accessibles à l'utilisateur et qui sont gérés en toute transparence par les différentes fonctions appartenant aux bibliothèques.

  8. #7
    inviteea028771

    Re : Un char sur plus de 8 bits en C ??

    Citation Envoyé par fiatlux Voir le message
    Ouais mais.....comment c'est possible? Je veux dire il faudrait dans ce cas que getchar et putchar fonctionne en alternance, genre:
    on stocke "c"
    putchar affiche "c"
    on écrase "c" et on stocke "o"
    putchar affiche "o"
    etc
    ...??
    Et donc il y a bien un "pointeur commun" entre putchar et getchar ?

    Et c'est exactement ce qui se passe dans ce code, ils fonctionnent en alternance :

    Si je tape "coucou", puis enter, il y a dans le buffer d'entrée "coucou\n"

    Donc le premier getchar récupère 'c', il reste alors "oucou\n" dans le buffer

    On entre alors dans la boucle while, le putchar affiche le 'c'
    Le getchar récupère alors 'o', reste "ucou\n" dans le buffer

    'o' est différent de EOF, donc on reste dans le while

    etc...

    putchar affiche le '\n', puis le getchar essaye de récupérer un caractère, mais le buffer d'entrée est vide, il retourne donc EOF

    on sort alors de la boucle

  9. #8
    Jack
    Modérateur

    Re : Un char sur plus de 8 bits en C ??

    Tryss a très bien expliqué ce qu'il se passe.

    Pour illustrer ce comportement, essaie d'exécuter le code en pas à pas si tu as la possibilité d'utiliser un debugger. Tu verras que le getchar de la boucle ne s'arrête pas pour que tu entres une lettre au clavier, mais va "piocher" dans le buffer d'entrée standard stdin.

    A+

  10. #9
    fiatlux

    Re : Un char sur plus de 8 bits en C ??

    Ah d'accord, merci beaucoup. MAIS une dernière chose me perturbe dans ce cas, c'est que quand je tape "coucou", il m'affiche coucou mais ensuite le programme est toujours en cours d'exécution, il attend encore que je tape quelque chose. Et si je tape quelque chose, ça l'affiche, et il ne quitte toujours pas la boucle. Il ne détecte pas l'EOF ?
    La pie niche-t-elle haut ? Oui, la pie niche haut.

  11. #10
    Jack
    Modérateur

    Re : Un char sur plus de 8 bits en C ??

    getchar est une macro qui correspond à fgetc(stdin).
    Cette fonction renvoie le caractère lue dans stdin normalement, EOF sinon. Le caractère de fin de ligne que tu as ajouté dans stdin en tapant sur la touche Entrée est un caractère normal, donc getchar ne renverra pas EOF.
    Tu peux donc faire retourner EOF soit en introduisant une erreur, en tapant CTRL C par exemple, soit en générant le caractère de fin de fichier (CTRL Z sur une ligne vide avec windows)

    A+

  12. #11
    fiatlux

    Re : Un char sur plus de 8 bits en C ??

    Citation Envoyé par Jack Voir le message
    Tu peux donc faire retourner EOF soit en introduisant une erreur, en tapant CTRL C par exemple
    C'est effectivement ce que je faisais jusqu'à maintenant. Je comprends mieux.

    Merci à tous pour les explications
    La pie niche-t-elle haut ? Oui, la pie niche haut.

Discussions similaires

  1. probleme resultat avec division de signed char sur PIC18F C18
    Par inviteac751535 dans le forum Électronique
    Réponses: 15
    Dernier message: 27/02/2012, 22h01
  2. probleme de division de char en C sur C18 (microchip pic 18F)
    Par inviteac751535 dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 24/02/2012, 23h18
  3. Programme 32 bits sur Windows 7 Home premium edition 64 bits
    Par invite7b1dcabe dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 10/02/2012, 18h08
  4. récupération du mot de 8 bits sur 4 bits
    Par grd666 dans le forum Électronique
    Réponses: 3
    Dernier message: 09/07/2008, 10h16
  5. [C]-Conversion Int -> Char, Float -> Char, ...
    Par invite3c35244f dans le forum Électronique
    Réponses: 2
    Dernier message: 25/06/2008, 11h05