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

Messages postés
24
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
27 décembre 2010
- - Dernière réponse : 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
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
3
Merci
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]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 188 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
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]
Commenter la réponse de cptpingu
Messages postés
24
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
27 décembre 2010
0
Merci
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).
Commenter la réponse de omarino_007
Messages postés
24
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
27 décembre 2010
0
Merci
Merci beaucoup ça marche... eh bein ... je commencer à désespérer voire à laisser tomber. Merci encore
Commenter la réponse de omarino_007
Messages postés
11
Date d'inscription
lundi 24 septembre 2007
Statut
Membre
Dernière intervention
13 mars 2010
0
Merci
C'est pas un peu lourd un realloc à chaque caractère? moi j'utiliserais une chaine de buffer intermédiaire...
Commenter la réponse de FlorimondH