2014-05-22 3 views
-2

Je veux faire un code en c pour chercher combien de fois une chaîne est trouvée dans un fichier txt en utilisant la fonction strstr().trouvé une chaîne avec strstr() à l'intérieur d'un txt

J'ai fait un code de test avec strastr() mais j'ai un problème.

par exemple j'ai une phrase comme " this is a text" et quand je cherche "is" j'obtiens un résultat "is found 2 times" parce qu'il prend le "est" de "ceci". Je ne veux pas prendre le is de this je veux "est" comme mot seulement. Puis-je effectuer une recherche sans ce « problème » avec strstr() avec quelques modifications

#include <stdio.h> 
#include<string.h> 
int main() 
{ 
    char*ptr; 
    char input[]=("this is a text"); 
    char key[10]; 
    int counter; 
    scanf("%s",key); 
    ptr=strstr(input,key); 
    while (ptr==NULL) 
    { 
     printf("not found\n"); 
     break; 
    } 
    while(ptr!=NULL) 
    { 
     counter++; 
     ptr=strstr(ptr+1,key); 
    } 
    printf("%s found %d times\n",key,counter); 
    return 0; 
} 
+2

Vous n'avez pas dit quel est votre problème. – AntonH

+3

Je soupçonne que même votre langue a des arrêts complets à la fin de ses phrases. –

+0

par exemple je veux rechercher le mot "est" compte 2 fois le mot "est" – user3666993

Répondre

1

Je devine que vous voulez faire une certaine forme d'expression régulière C. Et dans votre exemple, vous êtes à la recherche "\bis\b", plutôt que les caractères "is" (dans ce cas, vous obtenez les bons résultats).

Vous pouvez utiliser une forme de bibliothèque regex. Ces liens ont quelques informations:

Regular expressions in C: examples?

http://www.lemoda.net/c/unix-regex/

Ou vous pouvez regarder dans la mise en œuvre spécifiquement ce que vous cherchez. Quelque chose le long des lignes de

while(ptr!=NULL) 
{ 
    if (ptr == &input[0]) { 
     if (isspace(*(ptr+strlen(key)) || *(ptr+strlen(key)=='\0') { 
      counter++; 
     } 
    } else { 
     if (isspace(*(ptr-1) && (isspace(*(ptr+strlen(key)) || *(ptr+strlen(key)=='\0')) { 
      counter++; 
     } 
    } 
    ptr=strstr(ptr+1,key); 
} 

Note: Je sais que ce code est loin d'être optimisé, mais je pense qu'il est le code qui fonctionne et est assez explicite.

1

C'est le comportement attendu, la fonction strstr() ne correspond pas à des mots entiers, il est tout simplement un adaptateur de chaîne qui correspond à une sous-chaîne trouvée. Pour vos besoins, vous devez écrire un comparateur de chaînes personnalisé qui recherche des mots entiers et les assortit.

une façon de le faire est:

 1- Read the file character by character, skip all non alpha characters. 
    2- Start matching the word you are searching for character by character 
until either 
     - You mismatch one character, now skip all alpha characters. 
     - You matched the whole word, 
      - if the next character in the file is non-Alpha 
       - Increment your counter. 

http://www.cplusplus.com/reference/cstring/strstr/

+0

merci, je vais essayer de cette façon, mais je pense que c'est plus facile avec isspace – user3666993

Questions connexes