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 :

Rechercher une sous-chaine dans une chaine de caractères


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Futur Ingenieur en Informatique
    Inscrit en
    Décembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Futur Ingenieur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 20
    Par défaut Rechercher une sous-chaine dans une chaine de caractères
    Bonsoir !

    je veux savoir si un mot existe ou pas dans notre fichier ,le probleme c'est que le mot que j'ai saisi existe mais le prog me renvoie n'existe pas !
    je sais pas ou est l'erreur est ce que dans mon implementation ou bien dans la fonction strstr(),ou autre .
    est ce que il y'a une autre fonction qui fait la recherche autre que strstr()
    Merci !!




    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
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <string.h>
    #define BUFFER_SIZE 256
     
    int main(void)
    {
     
    unsigned char bufferR[256], bufferW[256];
      FILE *fichier = NULL;
      char chaine[BUFFER_SIZE] = "";
      char *chdecar;
     
     
       fichier = fopen("fichier.txt", "r");
       printf("veillez saisir le mot que vous voulez rechercher:\t");
       scanf("%s",bufferR);
       if (fichier != NULL)
       {
            while (fgets(chaine, BUFFER_SIZE , fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
              printf("%s", chaine);
             }
          fclose(fichier);  
        }    
     
        chdecar= strstr(chaine,bufferR);
     
        if (chdecar != NULL){
            printf("ce mot existe\n");
           return 1;
         }
        else{
            printf("ce mot n'existe pas\n");
            return 0;
        }
     
     
     
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    heu,
    La fonction strstr() doit être appelée à chaque itération de boucle while.

    Ou bien charger tout le fichier et rechercher sur la chaîne concaténée totale

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    C'est ce qu'il cherche à faire je pense : charger tout le fichier dans un tampon.

    Ton erreur est dans ce bloc (je te laisse chercher un peu ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (fgets(chaine, BUFFER_SIZE , fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
    {
        printf("%s", chaine);
    }

  4. #4
    Membre averti
    Homme Profil pro
    Futur Ingenieur en Informatique
    Inscrit en
    Décembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Futur Ingenieur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 20
    Par défaut
    c'est ce que j'ai fait , j'ai charger tous le fichier dans un tableau de chaine de caractere normalement !
    pourquoi l'erreur est dans la boucle pourtant j'ai essayé de lire chaque ligne de fichier et la copier dans le buffer chaine , je vois pas ou est l'erreur

  5. #5
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Affiche le contenu de ton buffer lorsque la boucle a terminé de s'exécuter, ça devrait te sauter aux yeux.

  6. #6
    Membre averti
    Homme Profil pro
    Futur Ingenieur en Informatique
    Inscrit en
    Décembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Futur Ingenieur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 20
    Par défaut
    je vous remercie
    lol je l'ai essayé tout a l'heure aprés avoir envoyé le msg ,je suis bete .
    le problem maintenant j'arrive pas a copier ce que fgets() lis, j'ai essayer strcmp() et sprint() meme chose je y'arrive pas .

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char BigBuf[50000];
    BigBuff[0] = 0;
     
    while ( ... ) 
    {
    strcat( BigBuff , ligne );
    }
    Pas optimal, mais doit fonctionner...

  8. #8
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu dois décaler l'adresse du tampon de destination à chaque appel, ou bien fgets va bien évidemment écraser le contenu de la ligne précédente :

    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
    #include <stdio.h>
    #include <string.h>
     
    #define BUF_SIZE 4096
     
     
    int main(int argc, char *argv[]) {
        if (argc != 3)
            return 1;
     
        FILE *f = fopen(argv[1], "r");
        if (!f)
            return 2;
     
        char buf[BUF_SIZE];
        size_t offset = 0;
     
        while (fgets(buf + offset, BUF_SIZE - offset, f)) {
            printf("%s", buf + offset);
            offset += strlen(buf + offset);
        }
     
        if (feof(f)) {
            if (strstr(buf, argv[2]))
                printf("\n'%s' found in %s!\n", argv[2], argv[1]);
            else
                printf("\n'%s' not found in %s\n", argv[2], argv[1]);
        }
     
        fclose(f);
     
        return 0;
    }
    La suggestion de dalfab fait tout à fait l'affaire également.


    Il y a toujours un souci avec fgets : cette fonction ne renvoie pas le nombre de caractères lus. On est donc toujours forcé de parcourir la chaîne pour déterminer cette information. Puisque tu lis tout le fichier d'une traite de toute manière, je te recommande plutôt d'utiliser fread.

  9. #9
    Membre averti
    Homme Profil pro
    Futur Ingenieur en Informatique
    Inscrit en
    Décembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Futur Ingenieur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 20
    Par défaut
    Matt_Houston
    dalfab


    je vous remercie pour votre aide, maintenant tout est reglé
    a bientot

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Remplacement de chaine dans une sous chaine
    Par fpouget dans le forum Langage
    Réponses: 4
    Dernier message: 23/02/2010, 08h49
  2. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  3. Réponses: 28
    Dernier message: 02/03/2008, 00h28
  4. Réponses: 16
    Dernier message: 10/01/2008, 15h12
  5. recherche d'une chaine dans une sous chaine
    Par claralavraie dans le forum Oracle
    Réponses: 1
    Dernier message: 31/07/2006, 12h00

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