Scanf, comment ne pas ignorer les espaces ?

cool2source Messages postés 15 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 24 novembre 2010 - 28 déc. 2009 à 13:28
cool2source Messages postés 15 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 24 novembre 2010 - 29 déc. 2009 à 02:51
bonjour,
Pour rendre mon petit programme un peu plus esthétique, je souhaite savoir s'il existe une fonction semblable à scanf() mais qui prendrait en compte les espaces lors de la saisie d'une chaine de caractères.
je suis bob = jesuisbob

Actuellement pour rendre le texte plus compréhensible, je remplace les espaces par des "_" lors de la saisie.
Si vous pouviez m'aiguiller vers une éventuelle solution...

Merci ;)

6 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
28 déc. 2009 à 14:23
scanf est tout à fait capable de "comprendre" les espaces :)

Ce n'est pas trivial, mais il faut jouer avec les propriétés de celui-ci. Un exemple voudra mieux qu'une explication:

#include <stdio.h>
#include <stdlib.h>

#define LENGTH 65
#define str(x) # x
#define xstr(x) str(x)

int main(void)
{
  int rc;
  char buff[LENGTH + 1] = "";

  printf("Enter a string with spaces: ");
  fflush(stdout);
  rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", buff);
  if (!feof(stdin))
    getchar();

  while (rc)
  {
    printf("Your string is: \n%s\n", buff);
    printf("Hit Enter key to end, or enter "
   "a string with spaces: ");
    fflush(stdout);
    rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", buff);
    if (!feof(stdin))
    {
      getchar();
    }
  }
  return 0;
}
0
cool2source Messages postés 15 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 24 novembre 2010
28 déc. 2009 à 15:22
Le novice que je suis est encore un peu dans le brouillard, mais je sais dans quelle direction chercher now. Je m'y colle ce soir. Merci
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
28 déc. 2009 à 15:27
Ok je t'ajoute des exemples plus simples, mais moins rigoureux:

#include <stdio.h>

int main(void)
{
  char buff[256] = {0};

  /* Exemple 1: moins complets, mais solide */
  printf("Enter a string with spaces: ");
  scanf("%255[^\n]%*[^\n]", buff);
  printf("String = %s\n", buff);

  /* Exemple 2: version la plus basique, ne gère aucun type d'erreur */
  printf("Enter a string with spaces: ");
  scanf("%[^\n]", buff);
  printf("String = %s\n", buff);

  return 0;
}
0
cool2source Messages postés 15 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 24 novembre 2010
29 déc. 2009 à 02:32
Merci pour tes exemples ;) j'ai compilé et j'ai obtenu le résultat que je désirais. Néanmoins je ne comprend pas le : %[^\n] .
L'occasion de parfaire mes connaissance, il me semble que "%d" ou "%c" servent à mettre au format d'un int ou d'un char. Ici que se passe-t-il avec "%[^\n]" dans --> scanf("%[^\n]", buff);
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
29 déc. 2009 à 02:43
%[^\n] => Prendre un chaine de caractère ne contenant pas de \n.
%*s => Dès le moment ou tu as une étoile après le %, ça veut dire intérpréter, mais ne pas récupérer.
Ex: scanf("%*s"); ou scanf("%*s%s%*s", buff);
%255s => Récupérer au max 255 caractères

%255[^\n]%*[^\n] => Tenter de récupérer 255 caractères, espace compris. Tous le reste est matché, mais n'est pas pris.

Ex: %4[^\n]%*[^\n] => Si on lui donne "t tit ututo ti", ca récupérera "t ti".
0
cool2source Messages postés 15 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 24 novembre 2010
29 déc. 2009 à 02:51
Je n'ai plus de questions, tout me semble clair. Merci pour toutes ces informations et pour la rapidité de tes réponses. tu m'as été d'une grande aide ;)
0
Rejoignez-nous