lecture d'une chaine de caractère

lecture d'une chaine de caractère - C - Programmation

Marsh Posté le 23-02-2007 à 11:42:09    

Bonjour,
 
    J'ai un petit problème avec la lecture de chaine de caractère. Je vousdrais lire une entrée clavier, bein sûr sans utiliser scanf... Donc rien de plus facile : je fais un while avec un fgetc(). mais le problème c'est que je ne veux pas que l'utilisateur rentre trop de caractères. Donc je pensais tout bêtement rajouter une condition, sur le nombre de caractères... mais le truc c'est que fgetc() est buffeurisé donc pas moyen de compter les caractères... Ce que je voudrais c'est arrêter la saisie après le dépassement de capacité de mon premier tableau...

Code :
  1. #include<stdio.h>
  2. int main(int argc, char **argv)
  3. {
  4.     int i = 0;
  5.     char c, tab[11], tab2[11];
  6.     printf("Donnez la première chaine : " );
  7.     while((c = fgetc(stdin)) != EOF && (i < 10))
  8.     {
  9.         tab[i] = c;
  10.         i++;
  11.     }
  12.     tab[i] = '\0';
  13.     i = 0;
  14.     printf("Donnez la 2e chaine : " );
  15.     while((c = fgetc(stdin)) != EOF && (i < 10))
  16.     {
  17.         tab2[i] = c;
  18.         i++;
  19.     }
  20.     tab2[i] = '\0';
  21.     return 0;
  22. }


car là si la personne maintient un bouton enffoncé... et bien j'ai les 10 premier caractères dans le premier tableau et les 10 suivants dans le deuxième...
Est ce que vous saurriez comment faire pour arrêter la saisie et afficher le deuxième message ?
 
Merci :)

Reply

Marsh Posté le 23-02-2007 à 11:42:09   

Reply

Marsh Posté le 23-02-2007 à 11:44:19    

En fait ce que je me dit c'est qu'au final il faudrais pouvoir vider le buffer....

Reply

Marsh Posté le 23-02-2007 à 11:46:36    

c doit être de type int.
 
si fgets(chaine) != EOF
  si la chaine ne se termine pas par un '\n'
    alors while (c = fgetc != EOF and c != '\n')
       ne rien faire
 

Reply

Marsh Posté le 23-02-2007 à 11:49:26    

ok, merci Taz
sinon, j'ai trouvé : il faut faire un fflush(stdin); après la remière saisie... je sais pas si c'est propre mais ça a l'air de marcher...

Reply

Marsh Posté le 23-02-2007 à 11:59:48    

NON NON NON PUTAIN !

Reply

Marsh Posté le 23-02-2007 à 12:40:08    

Taz a écrit :

NON NON NON PUTAIN !


+1 sur le fond (pas sur la forme :D)
fflush( <flux d'entrée> ) c'est pas portable. Ca marche assez souvent mais c'est dégeux.

Reply

Marsh Posté le 23-02-2007 à 13:26:59    

Ok, promis je le referai pas :D
 
Donc, sauf erreur de ma part le code de Taz donne :

Code :
  1. if(fgets(tab, 10, stdin) != EOF)
  2.     if(tab[strlen(tab)-1] != '\n')
  3.         while((c = fgetc(stdin)) != EOF && c != '\n') {};


 
ce qui marche... mais j'avoue ne pas bien comprendre : le fgets() va lire les 10 caractères max que l'utilisateur va taper et les mettre dans le tableau puis le reste dans un buffer. On regarde si la saisie c'est terminée par un entrée, si c'est le cas on parcout tous les caractères du buffer... et j'imagine que c'est pour vider le reste du buffer c'est ça ?


Message édité par Amonchakai le 23-02-2007 à 13:30:05
Reply

Marsh Posté le 23-02-2007 à 14:37:22    

On ne vide pas le buffer. On continue la lecture jusqu'à la fin de ligne, pour la consommer. stdin c'est un fichier, avec ces fgetc, on fait juste en sorte d'avancer un peu jusqu'à trouver le début de prochaine ligne.

Reply

Marsh Posté le 23-02-2007 à 16:55:17    

Amonchakai a écrit :

ok, merci Taz
sinon, j'ai trouvé : il faut faire un fflush(stdin);


:vomi: Merci, faut encore que je change de clavier...

 

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

 

Message cité 1 fois
Message édité par Emmanuel Delahaye le 23-02-2007 à 16:56:22

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-02-2007 à 17:58:23    

Taz a écrit :

On ne vide pas le buffer. On continue la lecture jusqu'à la fin de ligne, pour la consommer. stdin c'est un fichier, avec ces fgetc, on fait juste en sorte d'avancer un peu jusqu'à trouver le début de prochaine ligne.


Ok, merci j'ai compris  


J'avais déja regardé... mais sûrement lut trop vite car j'avais pas trouvé ma réponse... Donc je vais regarder à nouveau.
 
Merci à vous
 
ps : promis je vous ressortirai plus jamais cette horreur :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed