Votre question

Fonction C de récupération de l'entrée de l'utilisateur

Tags :
  • Standard
  • Programmation
Dernière réponse : dans Programmation
24 Décembre 2011 15:24:42

Bonjour,

J'ai réalisé cette fonction permettant à l'utilisateur de rentrer un texte sur le flux d'entrée standard.

  1. char *get_str(char c) {
  2. size_t n=0, i=0, e=1;
  3. char *s=NULL;
  4. do {
  5. if (i+2>n) {
  6. s=realloc(s,(n+e)*sizeof*s);
  7. if (!s) return NULL;
  8. n+=e,e*=2;
  9. }
  10. s[i]=(char)getchar();
  11. } while (s[i++]!=c);
  12. s[i-1]='\0';
  13. return s;
  14. }


Qu'en pensez-vous ? Voyez-vous quelques améliorations/optimisations à faire au niveau de l'allocation ? :) 

Autres pages sur : fonction recuperation entree utilisateur

a b L Programmation
28 Décembre 2011 21:33:17

Tu peux commencer par allouer le premier buffer suffisamment grand (par exemple 256).
29 Décembre 2011 18:39:28

Comme ça ? :) 

  1. char *getstr(char c) {
  2. size_t n=256;
  3. char *s=malloc(n);
  4. if (!s) return NULL;
  5. else {
  6. size_t i=0,e=1;
  7. do {
  8. if (i+2>n) {
  9. s=realloc(s,(n+e));
  10. if (!s) return NULL;
  11. n+=e,e*=2;
  12. }
  13. s[i]=(char)getchar();
  14. } while (s[i++]!=c);
  15. }
  16. return s;
  17. }
Contenus similaires
a b L Programmation
29 Décembre 2011 18:47:46

Initialise aussi e à n (=256), comme ça tu feras 256, 512, 1024, etc.
30 Décembre 2011 10:34:23

D'accord, merci à toi. :) 

  1. char *getstr(char c) {
  2. size_t n=256,i=0,e=n;
  3. char *s=malloc(n);
  4. if (!s) return NULL;
  5. do {
  6. if (i+2>n) {
  7. s=realloc(s,(n+e));
  8. if (!s) return NULL;
  9. n+=e,e*=2;
  10. }
  11. s[i]=(char)getchar();
  12. } while (s[i++]!=c);
  13. return s;
  14. }
a b L Programmation
30 Décembre 2011 11:43:50

Et tu peux aussi te passer de la variable e, car il te suffit de faire un n*=2 juste avant le realloc, mais ça revient au même.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS