Chercher une chaine dans un fichier texte C
Fermé
stroumpf
-
12 nov. 2011 à 23:07
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 14 déc. 2013 à 10:59
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 14 déc. 2013 à 10:59
A voir également:
- Chercher une chaine dans un fichier texte C
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
4 réponses
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
13 nov. 2011 à 00:18
13 nov. 2011 à 00:18
dans ta fonction strstr, tu n'aurais pas échangé l'ordre des arguments ?
il me semble que la fonction est :
char *strstr (const char *meule_de_foin, const char *aiguille);
(avec de très bon noms d'arguments, tiré de http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strstr.3.html :) )
en lisant, j'ai compris que tu cherchais chaine dans chaine2, et pas chaine2 dans chaine.
il me semble que la fonction est :
char *strstr (const char *meule_de_foin, const char *aiguille);
(avec de très bon noms d'arguments, tiré de http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strstr.3.html :) )
en lisant, j'ai compris que tu cherchais chaine dans chaine2, et pas chaine2 dans chaine.
Merci Pacorabanix pour ta reponse,
En fait je cherche Mot1 dans chaine2
Le probleme là c'est quil maffiche "sous_chaine" c'est toute la phrase et non pas la chaine recherchée
Tu as une idée?
Merci
Best regards
En fait je cherche Mot1 dans chaine2
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE* fichier = NULL; FILE* fichier2 = NULL; char chaine[50]; char chaine2[50]; int n=0; char mot1[50], mot2[50]; char *sous_chaine, *tmp; fichier = fopen("IMC_Test.txt", "r"); fichier2 = fopen("CorpusTest.txt", "r+"); if (fichier != NULL) { // On peut lire et écrire dans le fichier while (fgets(chaine, sizeof chaine, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { printf("%s", chaine); // On affiche la chaîne qu'on vient de lire sscanf(chaine,"%[^-]", mot1); printf("%s\n", mot1); if (fichier2 != NULL) { // On peut lire et écrire dans le fichier while (fgets(chaine2, sizeof chaine, fichier2) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { printf("%s", chaine2); // On affiche la chaîne qu'on vient de lire if ((sous_chaine = strstr(chaine2, mot1)) != NULL) printf("%s", sous_chaine); } } } fclose(fichier); // On ferme le fichier qui a été ouvert fclose(fichier2); // On ferme le fichier qui a été ouvert } else { // On affiche un message d'erreur si on veut printf("Impossible d'ouvrir le fichier test.txt"); } return 0; }
Le probleme là c'est quil maffiche "sous_chaine" c'est toute la phrase et non pas la chaine recherchée
Tu as une idée?
Merci
Best regards
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
14 nov. 2011 à 14:58
14 nov. 2011 à 14:58
oui.
strstr renvoie un pointeur vers l'endroit dans la chaine ou le mot recherché commence.
mais c'est un pointeur dans la chaine elle-même. donc au tout début de la chaine, puisque le mot est au début.
si tu essaies d'afficher la chaine, afficher le pointeur trouvé, il va afficher toute la chaine, car la fonction strstr n'a pas crée de nouvelle chaine, elle n'a pas rajouté de caractère '\0' pour marquer la fin de la recherche non-plus.
donc strstr a bien trouvé ta chaine !
si tu veux juste "l'afficher", il faut copier le bon nombre de caractères (sizeof(mot1)) à partir de l'endroit pointé par sous-chaine. mais je ne sais pas si c'est vraiment ce que tu veux faire. (tu veux afficher juste pour tester que ta recherche marche bien ? )
strstr renvoie un pointeur vers l'endroit dans la chaine ou le mot recherché commence.
mais c'est un pointeur dans la chaine elle-même. donc au tout début de la chaine, puisque le mot est au début.
si tu essaies d'afficher la chaine, afficher le pointeur trouvé, il va afficher toute la chaine, car la fonction strstr n'a pas crée de nouvelle chaine, elle n'a pas rajouté de caractère '\0' pour marquer la fin de la recherche non-plus.
donc strstr a bien trouvé ta chaine !
si tu veux juste "l'afficher", il faut copier le bon nombre de caractères (sizeof(mot1)) à partir de l'endroit pointé par sous-chaine. mais je ne sais pas si c'est vraiment ce que tu veux faire. (tu veux afficher juste pour tester que ta recherche marche bien ? )
// estDans est une fonction qui renvoie 1 si mainStr contient subStr int StartsWith(const char *mainStr,const char *subStr) { if (*subStr == '\0') return 1; if (*mainStr != *subStr) return 0; return StartsWith(mainStr+1,subStr+1); } int estDans(const char *mainStr,const char *subStr) { if (StartsWith(mainStr,subStr)) return 1; if (*mainStr == '\0') return 0; return estDans(mainStr+1,subStr); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
14 déc. 2013 à 10:59
14 déc. 2013 à 10:59
Bonjour,
Je ne crois pas que la question soit : "recréer la fonction strstr() en récursif" ;-)
Je ne crois pas que la question soit : "recréer la fonction strstr() en récursif" ;-)