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
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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