quelques questions de debutant

Voir le sujet précédent Voir le sujet suivant Aller en bas

quelques questions de debutant

Message  elmcherqui le Mar 16 Sep 2008 - 20:37

bonjour ,
tous d'abord je te remercie pour la qualité des information du site que je trouve très intéressantes et qu'on ne trouve rarement dans les livres
j'aurais donc quelques questions qui handicapent mon avancée sur le C :

/****************************************************************************/

-concernant la fonction getch() ( incluse dans l'entête <conio.h> ) c'est une fonction qui envoie directement les caractères lus dans le flot stdin même sans appuyer sur la touche entrée a ce que j'ai compris . ma question:
je veux écrire une phrase "hello world" par exemple .
pourquoi ce code marche
Code:

#include <stdio.h>
#include<conio.h>

int main(void){

    char cara=' ';
    while( (cara = getch()) != '\r' )
        putchar(cara);
  return 0;
}

et ne marche pas quand on remplace le '\r' par '\n' , et encore c'est quoi la différence entre le retour chariot et le retour a la ligne ?

/***************************************************************************/

concernant la fonction scanf . elle lit les donnee qui l'interessent dans le flot stdin et y met un '\n' c'est pour cela elle est considérée comme dangereuse .
mais alors pourquoi ce code marche normalement ?
Code:

#include <stdio.h>

int main(void){
    int a=0,b=0;
    scanf("%d",&a);
    scanf("%d",&b);

    printf("%d %d",a,b);

  return 0;
}
le premier scanf laisse le '\n' dans stdin puis le second scanf ignore le '\n' j'aimerais savoir pourquoi svp ?

/******************************************************************************/

j'aimerais connaitre la meilleur facon pour traiter les caracteres parasites qui restent sur stdin par exemple le '\n' ou un surplus de donnée .

/******************************************************************************/

j'ai toujours lu sur les forum que fflush(FILE *fp) est une fonction a ne pas utiliser sur stdin car elle provoque des résultats indéterminés elle est concu pour etre utilise sur les flux sortant comme stdout.
je n'arrive pas a trouver une utilisation concrète pour fflush(stdout) j'aimerais avoir un petit exemple .

/******************************************************************************/

en tous cas même sans avoir de réponse je te remercie infiniment pour ce site qui est une mine de diamants pour un débutant comme moi .
sur ce bonne soirée

elmcherqui

Messages : 2
Date d'inscription : 16/09/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelques questions de debutant

Message  -ed- le Jeu 18 Sep 2008 - 12:42

elmcherqui a écrit:
-concernant la fonction getch() ( incluse dans l'entête <conio.h> ) c'est une fonction qui envoie directement les caractères lus dans le flot stdin
Euh, non. Ce ne serait pas possible. Ca prend les caractères directement issus du buffer du clavier sans passer par stdin. Et je rappelle que ce n'est pas portable.

je veux écrire une phrase "hello world" par exemple .
pourquoi ce code marche
Code:

#include <stdio.h>
#include<conio.h>

int main(void){

    char cara=' ';
    while( (cara = getch()) != '\r' )
        putchar(cara);
  return 0;
}
et ne marche pas quand on remplace le '\r' par '\n' , et encore c'est quoi la différence entre le retour chariot et le retour a la ligne ?
Comme indiqué au-dessus, getch() ne passe ni par le système (enfin très peu) ni par stdin et donc aucune interprétation des caractères n'est faite.

En fait, sur une machine DOS/Windows, quand on tape sur la touche ENTER, c'est un code ASCII 13, soit CR (Carriage Return) qui est émis. Or CR est '\r' en C. C'est pour ça que la détection de la touche ENTER se fait en testant le code '\r'.

'\n' est le code de LF (Line Feed) qui est 10 en ASCII.

Quand on utilise getchar() sous DOS/Windows, le système lit le caractère CR (\r), mais le remplace par LF (\n) de façon à ce que le code C ait le même comportement sur toutes les machines (le C standard est conçu pour être portable).

Sous Unix, il est probable (à vérifier) qu'un ENTER génère un '\n'.

concernant la fonction scanf . elle lit les donnee qui l'interessent dans le flot stdin et y met un '\n' c'est pour cela elle est considérée comme dangereuse .
Pas du tout.

Comme expliqué au-dessus, le '\n' est placé dans le flux stdin par le système lors qu'il détecte le code correspondant à la touche ENTER (plus généralement la touche de 'validation de saisie' ou de 'fin de saisie').

Par contre, scanf() ne lit pas ce caractères (sauf avec "%c" si c'est possible), ce qui fait que l'appel suivant à scanf() peut ne pas être bloquant et entrainer une boucle infinie dans certains cas (d'erreur de conversion, notamment).

http://mapage.noos.fr/emdel/notes.htm#fgetc

scanf() est dangereuse avec "%s" si on ne prend pas de précautions pour limiter le nombre de caractères lus :

Exclamation
Code:

char ligne[32];
scanf ("%s", ligne);
Par contre, si on précise la longueur max, pas de problèmes (mais les caractères non lus restent dans le flux)
Code:

char ligne[32];
scanf ("%31s", ligne);
Mais ce code est difficile à maintenir et assez ésotérique. On préfère un usage maitrisé et plus simple de fgets().


mais alors pourquoi ce code marche normalement ?
Code:

#include <stdio.h>

int main(void){
    int a=0,b=0;
    scanf("%d",&a);
    scanf("%d",&b);

    printf("%d %d",a,b);

  return 0;
}
le premier scanf laisse le '\n' dans stdin puis le second scanf ignore le '\n' j'aimerais savoir pourquoi svp ?
Parce que c'est le fonctionnement normal avec "%d". Comme déjà signalé, l'usage correct de scanf() est complexe, et est déconseillé aux débutants (et généralement ignoré des professionnels sérieux, sauf gourous qui savent ce qu'ils font).

j'aimerais connaitre la meilleur facon pour traiter les caracteres parasites qui restent sur stdin par exemple le '\n' ou un surplus de donnée .
1 - ne pas utiliser scanf()
2 - utiliser fgets() + une fonciton de nettoyage qui
Code:

cherche le \n dans le chaine saisie
Si elle le trouve
  remplace ce \n par un 0
Sinon
 lit tous les caractères non lus
retourne 1 en cas de débordement constaté, sinon 0.
Cette méthode est éprouvée. Je recommande l'interface suivant :
Code:
int purge(char *s)
ou, plus général :
Code:
int fpurge(char *s, FILE *fp)
Certaines versions de ces fonctions ont été publiées sur les forums C de Développez et du Site du Zéro.

j'ai toujours lu sur les forum que fflush(FILE *fp) est une fonction a ne pas utiliser sur stdin car elle provoque des résultats indéterminés elle est concu pour etre utilise sur les flux sortant comme stdout.
je n'arrive pas a trouver une utilisation concrète pour fflush(stdout) j'aimerais avoir un petit exemple .
Pour forcer l'affichage en mode console, si une ligne n'est pas terminée par un \n :
Code:

printf("nom : ");
fflush (stdout);
Tu ne verras peut être pas de différence sur ta plateforme, mais ce problème a été signalé sous FreeBSD et Mac Os/X.

http://mapage.noos.fr/emdel/notes.htm#fflush_stdout

Ça permet d'écrire du code portable et ça ne coûte quasiment rien.


Dernière édition par -ed- le Jeu 18 Sep 2008 - 15:42, édité 3 fois (Raison : typos)

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelques questions de debutant

Message  elmcherqui le Jeu 18 Sep 2008 - 14:47

merci pour ces precision , tous est plus clair maintenant :)

elmcherqui

Messages : 2
Date d'inscription : 16/09/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelques questions de debutant

Message  Contenu sponsorisé Aujourd'hui à 15:29


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum