begin process at 2012 05 28 14:28:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

boucle qui ne marche pas


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

boucle qui ne marche pas

mardi 26 avril 2011 à 21:07:09 | boucle qui ne marche pas

Leopold1000

Bonjours à tous!!

voila, j'ai fais un petit programme qui permet d'enregistré ce qu'écrit l'utilisateur sans dépasser 20 caractères. sauf que l'utilisateur peux entré plus de 20 caractères!
Je voudrais qu'une fois qu'il ai taper 20 caractère, on sort de la boucle, et le printf s'exécute.


Code C/C++ :
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char motActuel=' '; //la lettre taper
    int i=0; //pour parcourir le do/while
    char ligne[20]; //la chaine de caratère
    printf("Hello world!\n");
    do
    {
        motActuel=getchar(); //mets la lettre taper dans "motActuel"
        ligne[i]=motActuel;  //mets "motActuel" dans une case du tableau "ligne"
        i++;
    }while (i<20); // jusqu'à temps que l'utilisateur ai rentré 20 caratères
    printf("\n la char vaut %s", ligne); //affichage de la chaine de caractères
    return 0;
}


Merci d'avance
mardi 26 avril 2011 à 22:41:05 | Re : boucle qui ne marche pas

TeniX

Membre Club

Il peut en rentrer combien car tu dois sortir de la boucle un moment ou un autre?

Ciao
mardi 26 avril 2011 à 23:04:23 | Re : boucle qui ne marche pas

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

Le problème sous Linux est que la fonction getchar() ne quitte que lors de l'appui de [ENTREE] (il me semble).

Il est possible d'utiliser la fonction read() avec le fd stdin (0 je crois) et 1 octet à lire.

L'utilisation de la console est beaucoup moins pratique sous Linux que sous Windows. Il faut utiliser ioctl() pour la configurer.

@++
mardi 26 avril 2011 à 23:06:51 | Re : boucle qui ne marche pas

patatalo

Membre Club Administrateur CodeS-SourceS
Tu peux peut-être utiliser aussi scanf avec %20s.
mercredi 27 avril 2011 à 03:09:12 | Re : boucle qui ne marche pas

StayCrunchy

essaye ca :

i=0;
while( (lettre = getchar()) != '\n' )
{
...mot[i] = lettre;
...if(i<20) i++;
}
mot[i]='\0';

en gros on sort de la boucle quand l'utilisateur appuie sur Entrer, mais on ne garde que les 19 premiers caracteres.
J'espere avoir bien compris ce que tu cherchais...
mercredi 27 avril 2011 à 10:32:04 | Re : boucle qui ne marche pas

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Si tu es sous Unix, il te suffit de passer le terminal en mode "raw". En mode "raw" c'est toi qui décide comment tu interprètes ce que l'utilisateur tape. Il est alors facile d'émuler "getch" ou "kbhit" (que tu as directement sous Windows dans conio.h, si je ne dis pas de bêtise).

Ça ne fonctionnera pas sous tous les terminals (fonctionne sous Konsole et sûrement sous gnome terminal, mais pas sous urxvt):
Code C/C++ :
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct termios g_term_conf;

int unix_getch()
{
  struct termios newt;
  int ch;

  newt = g_term_conf;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  ch = getchar();
  putchar(ch); /* Pour émuler le comportement d'affichage */
  tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);
  return ch;
}

int main(void)
{
  int i = 0;
  char line[21] = {0};
  tcgetattr(STDIN_FILENO, &g_term_conf);

  printf("Hello world!\n");
  while (i < 20)
  {
    line[i] = unix_getch();
    ++i;
  }
  tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);

  printf("\nLa ligne vaut %s\n", line);
  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mercredi 27 avril 2011 à 14:48:27 | Re : boucle qui ne marche pas

Leopold1000

Merci a tous pour ces réponses!

@StayCrunchy Se n'est pas exactement ce que je veux faire. Je voudrais que au bout de 20 caractère l'utilisateur ne puisse pu rien ecrir et que l'on affiche ce qu'il viens d'ecrir.


@CptPingu étant débutant, je ne comprends pas le code que tu as rajouté, se serais simpa de m'expliquer. Merci d'avance!
mercredi 27 avril 2011 à 15:13:57 | Re : boucle qui ne marche pas

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Tu es sous Windows ou Linux ? C'est le genre de précision que tu dois donner sinon c'est dur de t'aider.
Est-ce que cette solution a fonctionné pour toi ?

Sous Windows, ce que tu veux faire est possible. getch (ou _getch) te permet de récupérer un caractère comme tu l'as décrit dans ton besoin.
Sous Linux, cette fonction n'existe pas. Je l'ai donc émulé.

tcgetattr(STDIN_FILENO, &g_term_conf);


Sauvegarde du contexte actuel. En gros, j'enregistre la configuration actuelle de la console.

tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);


Cette ligne remet la console dans son état initial.

struct termios newt;


Création d'un nouveau contexte de configuration de console.

newt.c_lflag &= ~(ICANON | ECHO);


ICANON est une option qui dit qu'on désactive les caractères spéciaux (notamment le fait d'appuyer sur entrée pour envoyer le caractère).
ECHO est une option qui dit si l'on affiche ce qui est tapé ou non.
D'ailleurs, j'aurais pu ne pas la désactiver au lieu de faire un "putchar(ch)" un peu plus loin.

&= ~(


Ce sont des masques de bits. C'est une notion avancées. Regarde sur internet si ça t'intéresse, mais je ne vais pas détailler cette notion.

tcsetattr(STDIN_FILENO, TCSANOW, &newt);


Application des options choisies.

ch = getchar();


Récupère un caractère. Comme on est en mode "raw", le comportement est différent et il récupère le caractère sans attendre l'appuie sur la touche entrée.

putchar(ch); /* Pour émuler le comportement d'affichage */


Au final, inutile, il suffit que je ne désactive pas l'option ECHO.

tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);
return ch;


On restaure la console en mode normal, avant de retourner le caractère récupéré.

Mon code en propre devrait être (sans les trucs inutiles):
Code C/C++ :
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct termios g_term_conf;

int unix_getch()
{
  struct termios newt;
  int ch;

  newt = g_term_conf;
  newt.c_lflag &= ~(ICANON);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  ch = getchar();
  tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);
  return ch;
}

int main(void)
{
  int i = 0;
  char line[21] = {0};
  tcgetattr(STDIN_FILENO, &g_term_conf);

  printf("Hello world!\n");
  while (i < 20)
  {
    line[i] = unix_getch();
    ++i;
  }

  printf("\nLa ligne vaut %s\n", line);
  return 0;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mercredi 27 avril 2011 à 16:03:43 | Re : boucle qui ne marche pas

Leopold1000

Merci beaucoup a toi!!
Effectivement, je suis sur Linux ubuntu.
C'est un peux du chinois tout ça mais si ça marche, c'est que c'est bien!

Et merci a tout le monde d'avoir répondu!



Cette discussion est classée dans : ligne, boucle, utilisateur, caractères, motactuel


Répondre à ce message

Sujets en rapport avec ce message

lecture chaines de caractères dans un fichier [ par sandy27 ] je veux lire dans un fichier des chaines de caractères qui vont contenir d'autres fichiers dont je devrai lire les données par la suite. Exemple: nom_ Problème de chaine [ par goutbouyo ] Salut,Je fais ça pour supprimer les 3 premiers caractères et le dernier d'une chaine LIGNE :char *c = ligne;  c+=3;  while (*c!='"')  {   c++;   coun probleme de boucle... Urgent ! [ par AshenShugar ] Salut tout le monde,voila, j'ai un morceau de code qui est celui-ci :while ((Ligne 20)) { Ligne = 0; printf("\nSaisissez le nombre de lignes Transfert d'une dbgrid à une Stringgrid [ par donny ] Salut,J ai c++ builder 4 et je souhaiterai transferer les elements de ma dbgrid dans une stringgridJ ai essayer de faire un code pour essayer d 'affic Savoir quand un utilisateur à supprimer un fichier ? [ par nicolos ] Salut,J'aimerais bien savoir coment intercepter le message de suppression d'un fichier ? Et ainsi permettre son autorisation de suppression ou non. To UpdateWindow et SendMessage (HEEEEEEELP!!!!!) [ par scelw ] Bonjour,Mon prog fonctionne grâce à une boucle principale, chargée d'effectuer de longs calculs. Je souhaite afficher, au fur et à mesure de l'avancem ligne d'horizon (urgent!!!) [ par tresorr ] bonjour,je suis une pauvre étudiante au bord du suicide (enfin presque..), qui doit faire un programme qui trace une liggne d'horizon et qui n'y compr problème ontexte mémoire et classe [ par gregory6 ] Bonjour Je travaille sous visual C++ et j?ai un petit problème de classe et de contexte mémoire. Je crée une classe ligne que j?appelle ds ma fonction Problème de saisie avec cin (c++) [ par SystemOfAXav ] Salut,Je doit programmer un petit jeu comme projet de fin de semestre.A plusieurs reprises, je demande a l'utilisateur de saisir un entierentre 3 et 1 deplacer la Camera [ par gazzall ] Bonjour a tous,J'ai un programme a réaliser où je dois programmer un programme qui represente un petit systeme solaire(avec les planet qui tourne). L


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales