IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

espaces dans un string ?


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut espaces dans un string ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct record {
     char name[30];
     char address[30];
     }company;
    Est ce possilble de mettre la ligne suivante dans company.address avec un fscanf?

    7595 Technology Way
    (cette ligne se trouve dans un fichier)

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Oui c'est possible.

  3. #3
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Oui c'est possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(sf, "%s", company.address);
    Je n'ai que le premier mot qui est mis pas les autres...

    comment faire pour tout inclure (meme les espaces)

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    On n’a jamais lu des structures avec la fonction fscanf je ne sais pas si c’est possible mais pour moi je travaille sur le turbo c++

    Tu peut lire toute la ligne avec toutes les espaces soi par
    1 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     int i=0 ;
    	Do{
    	Ch=fgetc(f) ;
    	Sf[i]=ch ;
    i++ ;
    }while(ch !=EOF);
    2-
    Ou bien avec la fonction fgets
    Par exemple :

  5. #5
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(sf, "%29[^\n]", company.address);

  6. #6
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(sf, "%29[^\n]", company.address);
    et pour afficher le resultat ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(stdout, "%s\n", company.address); // me donne un accent : `

  7. #7
    Membre habitué Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Points : 180
    Points
    180
    Par défaut
    salut
    tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fputs(company.address,f);//avec f pointeur vers le fichier

  8. #8
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    toujours rien

    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef struct {
     char name[30];
     char address[30];
    } record ;
     
    record readfile (FILE *, record company);
     
    int main (int argc, char *argv []) {
      record company;
      FILE *fp;
      char fname[30];
     
      if ( argc != 2 ) {
         fprintf ( stdout, "please specify a filename : ");
         gets(fname);
         }
     
      else if (argc > 2 ) fprintf ( stdout, "Usage : newcom [filename]\n");
     
      if ( ( fp = fopen ( fname, "r" ) ) == NULL ) {
         fprintf (stderr, "Unable to open specified file %s!\n", fname );
         exit ( 1 );
         }
     
       readfile(fp, company);
     
    fclose(fp);
    }
     
    record readfile (FILE *sf, record company) {
     
      fscanf(sf, "%s", company.name); 
      fscanf(sf, "%29[^\n]", company.address);
      fprintf(stdout, "%s\n", company.name); /* ca marche pour cette ligne */
      fprintf(stdout, "%s", company.address); /* celle-la non */
      fputs(company.address. sf); /* pareil */
    return(company);
    }
    fichier d'entree
    Microsoft
    7595 Technology Way

  9. #9
    Membre averti Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Points : 441
    Points
    441
    Par défaut
    Et avec un fgets ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #define NBCHARPARLIGNE 100
     
    void readfile(FILE *sf, record *company) {
       char *ligne=NULL;
     
       ligne=malloc(sizeof(char)*NBCHARPARLIGNE);
       if ( ligne==NULL ) {
          erreur...
       }
       if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) {
          strcpy(*company.name,ligne);
          fprintf(stdout,"%s\n",*company.name);
       }
       if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) {
          strcpy(*company.address,ligne);
          fprintf(stdout, "%s\n",*company.address);
       }
     
       free(ligne);
    }
    Si tu veux que la fonction readfile puisse modifier la structure company que tu lui donnes en argument, il faut lui donner un pointeur vers cette structure. L'appelle se fait donc par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    readfile(sf,&company);

  10. #10
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Je prend

    Merci pour la reponse.

    Il y avait un probleme de compilation
    tree.c: In function `readfile':
    tree.c:49: warning: passing arg 1 of `strcpy' makes pointer from integer without a cast
    tree.c:53: warning: passing arg 1 of `strcpy' makes pointer from integer without a cast
    Enlever les asterisk devant les fields de structures a regle le probleme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    record readfile (FILE *sf, record company) {
       char *ligne = NULL;
     
       ligne = malloc(sizeof(char)*NBCHARPARLIGNE);
       if ( ligne == NULL ) {
          fprintf(stderr, "error\n");
       }
       if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) {
          strcpy(company.name, ligne);
          fprintf(stdout,"%s\n",company.name);
       }
       if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) {
          strcpy(company.address,ligne);
          fprintf(stdout, "%s\n",company.address);
       }
     
       free(ligne);
    return(company);
    }
    Est ce qu'il ny aurait pas une alternative plus simple.

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par corentin59 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *ligne=NULL; 
       ligne=malloc(sizeof(char)*NBCHARPARLIGNE);
    renvoi toujours 1 donc soit tu écris directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne=malloc(NBCHARPARLIGNE);
    soit et c'est ce que je conseille, tu utilise la forme canonique (merci à Emmanuel Delahaye) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne=malloc(NBCHARPARLIGNE * sizeof *ligne);
    qui a un énorme avantage c'est que si un jour tu te mets à l'unicode tu n'as qu'un seul changement à faire :
    avec l'entête qui va bien.

    Cordialement.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(sf, "%29[^\n]", company.address);
    D'après mes essais (correction du code de virtuadrack), ça ne fonctionne pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef struct
    {
       char name[30];
       char address[30];
    }
    record;
     
    /* -ed-
    record readfile (FILE * sf, record company)
     
    Horrible ! Meme si c'est techniquement possible,
      on ne passe pas une structure en entier. On ne passe que son adresse... ;
     
    void readfile (FILE * sf, record *p_company)
     
    ou
     
    si on gere un code retour...
      */
    int readfile (FILE * sf, record * p_company)
    {
       int err = 0;
       int n;
       n = fscanf (sf, "%s", p_company->name);
     
       err = n != 1;
       if (!err)
       {
          fprintf (stdout, "%s\n", p_company->name); /* ca marche pour cette ligne */
          n = fscanf (sf, "%29[^\n]", p_company->address);
          printf ("n=%d\n", n);
          fprintf (stdout, "%s", p_company->address); /* celle-la non */
    /* -ed-
       fputs (company.address.sf);
    ceci n'a aucun sens. Tu voulais peut etre dire
     
       fputs (company.address,sf);
     
    mais ce n'est pas mieux, car sf est un fichier ouvert en lecture...
     
    Ce que tu veux est :
    */
          fputs (p_company->address, stdout);
       }
       else
       {
          perror ("");
       }
     
    /* -ed- parentheses inutiles...
       return (company);
    */
       return err;
    }
     
    int main (int argc, char *argv[])
    {
    /* -ed- revision de l'algorithme... */
       char fname[30];
       if (argc != 2)
       {
          fprintf (stdout, "please specify a filename : ");
    /* -ed- fonction interdite !
    utiliser fgets() et nettoyer correctement.*/
          gets (fname);
       }
       else
       {
    /* -ed- Eek ! fname n'est jamais initialise... */
    /*
       if ((fp = fopen (fname, "r")) == NULL)
    */
          strcpy (fname, argv[1]);
       }
     
       {
          FILE *fp = fopen (fname, "r");
          if (fp != NULL)
          {
             record company;
             readfile (fp, &company);
     
             fclose (fp);
          }
          else
          {
             perror (fname);
          }
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Microsoft
    n=0
      ╬├┐w↑ "  ╬├┐w↑ "
    Press ENTER to continue.

  13. #13
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    D'après mes essais (correction du code de virtuadrack), ça ne fonctionne pas...
    C'est normal, tu ne sautes pas le caractères '\n' alors tu bloque dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <stdio.h>
     
    typedef struct
    {
       char name[30];
       char address[30];
    }
    record;
     
    int readfile (FILE * sf, record * p_company);
    int create_file(char const *filename);
     
    int main (void)
    {
       char const *fname = "fichier.tmp";
       if (create_file (fname) == 0)
       {
          FILE *fp = fopen (fname, "r");
          if (fp != NULL)
          {
             record company = { 0 };
             readfile (fp, &company);
             fclose (fp);
          }
          else
          {
             perror (fname);
          }
          remove(fname);
       }
       return 0;
    }
     
    int readfile (FILE * sf, record * p_company)
    {
       int err = 0;
     
       if (fscanf (sf, "%29s", p_company->name) !=1)
       { 
          err = 1;
       }
       else
       {
          puts (p_company->name);
          fgetc (sf);
          if (fscanf (sf, "%29[^\n]", p_company->address) != 1)
          {
             err = 2;
          }
          else
          {
             puts (p_company->address);
          }
       }
     
       return err;
    }
     
    int create_file(char const *filename)
    {
       int err = 0;
       FILE *fichier = fopen(filename,"w");
       if(fichier == NULL)
       {
          perror(__func__);
          err = 1;
       }
       else
       {
          fputs("nom_au_hasard\n",fichier);
          fputs("7595 Technology Way\n",fichier);
          fclose(fichier);
       }
       return err;
    }

  14. #14
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Merci pour vos reponses.

    J'ai pris en compte beaucoup de vos corrections.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #define NBCHARPARLIGNE 100
     
    typedef struct {
     char name[30];
     char address[30];
     char city[30];
     char state[4];
     double zip[15];
     char phone[13];
     char email[30];
    }record;
     
     
    int readfile (FILE * sf, record * company);
     
    int main (int argc, char *argv[])
    {
       char fname[30];
       FILE *sf;
       if (argc != 2) {
          fprintf (stdout, "please specify a filename : ");
          gets (fname);
          }
     
       else {
            if ((sf = fopen (fname, "r")) == NULL)
            strcpy (fname, argv[1]);
            }
     
       {
          FILE *sf = fopen (fname, "r");
          if (sf != NULL)
          {
             record company;
             readfile (sf, &company);
             fclose (sf);
          }
          else
          {
             perror (fname);
          }
       }
       return 0;
    }
     
    int readfile (FILE *sf, record *company) {
       char *ligne = NULL;
     
       ligne = malloc(NBCHARPARLIGNE * sizeof * ligne);
     
       if ( ligne == NULL ) {
          fprintf(stderr, "error\n");
          }
     
       if ( fgets(ligne,NBCHARPARLIGNE, sf) != NULL) {
          strcpy(company->name, ligne);
          fprintf(stdout,"\n%s", company->name);
          }
     
       if ( fgets(ligne,NBCHARPARLIGNE, sf) != NULL) {
          strcpy(company->address, ligne);
          fprintf(stdout, "%s",company->address);
          }
     
       free(ligne);
    return 0;
    }
    Je veux apprendre a faire des arbres binaires, et je voudrais savoir si c'est possible d'integrer les informations lues dans la fonction readfile dans un arbre binaire pour y effectuer des recherches sur les compagnies. Chaque recherche sur le nom de la compagnie devra afficher toutes ses informations (addresse, email, phone...)


    Est ce que la "key" de l'arbre binaire doit etre juste le nom de la compagnie, ou doit-il y a voir plusieurs keys pour chaque information ? Si oui, dois-je mettre une deuxieme structure de cette maniere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct _noeud {
      char *companyname;
      noeud *gauche, *right;
      } noeud;
    Ou bien utiliser ma structure principal et essayer dy inclure la cle, et les noeuds gauche et droit ?

    Merci

    PS: Tout autre critique de mon code est la bienvenue

  15. #15
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    test2.c:35: attention : declaration of «sf" shadows a previous local
    test2.c:23: attention : déclaration est masquée ici
    test2.c:26: warning: the `gets' function is dangerous and should not be used.

  16. #16
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc tree.c -Wall -o tree
    Me signale aucun warning ni aucune erreur.

  17. #17
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Alors il faut apprendre à le régler correctement :
    http://emmanuel-delahaye.developpez....fg_compilo_gcc
    Cordialement.

Discussions similaires

  1. Comment éliminer un espace dans un string ?
    Par khadi8 dans le forum C#
    Réponses: 1
    Dernier message: 11/01/2015, 10h31
  2. Vérification d'espace dans un String
    Par zouuc dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 24/02/2009, 14h56
  3. Les espaces dans une String vers une <TextArea>
    Par loopx dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 21/03/2008, 14h37
  4. Mettre des espaces dans une string à intervalles réguliers.
    Par benitoelputoamo dans le forum Général Python
    Réponses: 3
    Dernier message: 15/11/2006, 16h14
  5. [String] supprimer un espace dans un String
    Par Zanton dans le forum Langage
    Réponses: 5
    Dernier message: 13/07/2006, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo