Récuération chaine de caractère taille variable stdin

Résolu
omarino_007 Messages postés 24 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 27 décembre 2010 - 11 févr. 2010 à 20:00
FlorimondH Messages postés 11 Date d'inscription lundi 24 septembre 2007 Statut Membre Dernière intervention 13 mars 2010 - 13 mars 2010 à 15:32
Bonsoir,
Je cherche a enregistrer une chaine de caractère (en pratique c'est le résumé d'un livre pour un projet de gestion de bibliothèque), que j'écris par la suite dans un fichier .
Le problème c'est que ce résumé est à taille variable (selon ce que rentre l'utilisateur), et que je ne sais pas comment gérer la saisie au clavier de l'utilisateur puisque l'utilisateur doit être capable de faire des retours a la ligne alors que dans un terminal un retour à la ligne correspond a la fin de la saisie.
Merci à l'avance pour vos réponses et vos propositions

5 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
12 févr. 2010 à 23:25
Pas besoin d'aller aussi loin que le hook clavier.
Au lieu d'utiliser un champ max, tu utilises simplement une chaîne dynamique, sans champs MAX. Tu définis le caractère de fin à EOF (CTRL + D une ou deux fois pour l'utilisateur):
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  char* chaine = 0;
  char c;
  int i = 0;

  printf("Tapez une phrase : \n");
  while ((c = getchar()) && c != EOF)
  {
    ++i;
    chaine = realloc(chaine, (i + 1) * sizeof (char));
    chaine[i - 1] = c;
    chaine[i] = 0;
  }
  printf("Vous avez tape : '%s'\n", chaine);
  free(chaine);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
12 févr. 2010 à 22:20
C ou C++ ?
Vu le forum, je pense que tu le veux en C.

Il te suffit d'utiliser autre chose que scanf.
Tu as getchar, qui récupère un et un seul caractère:
#include <stdio.h>
#define MAX 32

int main (void)
{
  char chaine[MAX + 1] = {0};
    char c;
    int i = 0;

    printf("Tapez une phrase : \n");
    while ((c = getchar()) && i < MAX && c != 'X')
    {
      chaine[i] = c;
      ++i;
    }
    printf("Vous avez tape : '%s'\n", chaine);

    return 0;
}


Ce code ignore les sauts de ligne, et ne s'arrête que si le nombre de caractères entrée excède MAX (qui vaut 32), ou si tu place un X (qui ne sera pas pris en compte).
Ce n'est qu'un exemple, à toi de l'améliorer.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
omarino_007 Messages postés 24 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 27 décembre 2010
12 févr. 2010 à 23:17
Bonjour, tout d'abord merci pour la réponse.
Au fait, c'est en C.
Le problème est dans la limite.
Dans mon cahier de charge ma chaine de caractere (resumé) n'a pas de taille prédéfinie (variable), donc pas de "MAX".
Le problème c'est que dès que l'utilisateur appuie sur ENTREE la chaine de caractère est automatiquement validée :s
j'ai réussi à faire une fonction qui lit dynamiquement une chaine de caractère de l'entrée standard (avec realloc ...) mais celle là lit infiniment :s .
Je pense que je vais laisser tomber ca, j'ai fais des tests, mon noyau marche bien, c'est l'essentiel. Je vais passer par une interface graphique (ncurses ou WIN API)
J'aimerai quand même savoir, dans le cas où quelqu'un saurait, comment on pourrai faire ça.
J'ai pensé a utiliser un hook pour intercepter les touches au clavier (demander à l'utilisateur de rentrer un racourci au clavier à la fin de sa chaine).
0
omarino_007 Messages postés 24 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 27 décembre 2010
12 févr. 2010 à 23:54
Merci beaucoup ça marche... eh bein ... je commencer à désespérer voire à laisser tomber. Merci encore
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FlorimondH Messages postés 11 Date d'inscription lundi 24 septembre 2007 Statut Membre Dernière intervention 13 mars 2010
13 mars 2010 à 15:32
C'est pas un peu lourd un realloc à chaque caractère? moi j'utiliserais une chaine de buffer intermédiaire...
0
Rejoignez-nous