2013-07-02 2 views
1

Good Day,strstr trouver un mot dans une chaîne en utilisant c retourner vrai tout le temps

Je décide donc de faire une dépression à nouveau mon C et commencé à faire une simple recherche le mot dans une chaîne.

Voici mon code:

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 

main(){ 
char word[100]; 
char sentence[100]; 

clrscr(); 
printf("Enter a word: "); 
fgets(word, 100, stdin); 
getch(); 
printf("The word is : %s", &word); 
getch(); 
printf("\nEnter a sentence: "); 
fgets(sentence, 100, stdin); 
getch(); 
printf("The sentence is: %s",&sentence); 
getch(); 
if(strstr(sentence,word) == 0){ 
    printf("word found!"); 
} 
getch(); 
return 0; 
} 

Le problème est maintenant que chaque fois que je tente de rechercher le mot dans une chaîne à l'aide strstr, il retourne toujours mot trouvé. J'ai également essayé d'utiliser strcmp mais cela ne fera que comparer la première instance de la chaîne et s'arrêtera lorsqu'une correspondance n'est pas trouvée donc ce n'est pas vraiment conseillé si vous voulez faire un mot de recherche dans un problème de chaîne.

Je n'ai pas vraiment fait un programme comme ça avant, jamais eu besoin d'une réalité. Donc, puis-je demander pourquoi ne fonctionne pas correctement puisque selon sa description strstr devrait être de chercher un mot dans une phrase ou l'ai-je mal compris.

Aussi, si vous avez des commentaires sur mon programme, n'hésitez pas à le dire, afin que je puisse prendre conscience de mon erreur.

Merci

Exemple: mot: chien
phrase: le chien est ici
doit renvoyer true

+0

Vous imprimez mal 'printf ("La phrase est la suivante:% s", et la peine);' –

+0

@Armin I Je suis désolé mais ce n'est pas ce que j'ai écrit? – magicianiam

+0

Oui c'est. Je le signale. –

Répondre

4

Cette ligne

if(strstr(sentence,word) == 0) 

devrait être

if(strstr(sentence,word) != NULL) 

strstr() renvoie un pointeur sur la première occurrence de word dans sentence ou si le NULL w ord n'a pas été trouvé.

Pour les détails please read here.


utilisant également fgets() à lire dans les « cordes » à '\n' joint une fin des « cordes ». Cela interdit la comparaison réussie.

Pour hacher du '\n' arrière, vous pouvez faire comme ceci:

fgets(word, sizeof(word), stdin); 
{ 
    size_t size = strlen(word); 

    if (size && ('\n' == word[size-1])) 
    { 
    word[size-1] = '\0'; 
    } 
} 
+0

Bonne journée @alk, j'ai essayé et ça ne fonctionnait toujours pas, ça ne fonctionnait que lorsque le mot pouvait être trouvé au début de la phrase. – magicianiam

+0

que suggérez-vous comme une alternative aux fgets? – magicianiam

+0

@magicianIam: Rien, en utilisant 'fgets()' est un choix sécurisé pour faire ce que vous faites. – alk

2

Renvoie un pointeur sur la première occurrence de str2 dans str1, ou un pointeur nul si str2 ne fait pas partie de str1.

Renvoyer la valeur NULL (0) signifie essentiellement que la chaîne n'a pas été trouvée.

Ainsi

if(strstr(sentence,word) == 0){ 
    printf("word found!"); 
} 

devrait être

if(strstr(sentence,word) != NULL){ 
    printf("word found!"); 
} 

Source - http://en.cppreference.com/w/c/string/byte/strstr

De plus, comme le souligne Armin, vous ne devez pas utiliser l'opérateur d'adresse, &, dans votre printf. %s attend d'avoir un pointeur passé à printf et en utilisant le nom du tableau que sentence est en fait le même que celui d'un pointeur vers le début du tableau, à savoir sentence == &sentence[0]

+1

Pourquoi la downvote? –

1

La fonction strstr() trouve la première occurrence de la sous-chaîne « aiguille » dans la chaîne « botte de foin » et il renvoie le pointeur au début de la sous-chaîne ou NULL si non trouvé.

de sorte que votre instruction if devrait être

if(strstr(sentence,word) != NULL){ 
printf("word found"); 
} 

nom Array représente l'adresse de base de son propre, l'écriture si

printf("%s",&word) 

ou

printf("%s",word) 

à la fois l'adresse de base de repesents du tableau.

0

Il y a une petite correction dans votre code-à-dire,

if(strstr(sentence,word) == 0){ 
printf("word found!"); 
} 

Le changement est: au lieu == 0 à 0 = ce qui équivaut à = NULL, en cas de pointeurs NULL 0 et sont même! . parce que mot-clé NULL est défini comme:

#define NULL ((void *)0) 

donc changer votre code à

if(strstr(sentence,word) != 0){ 
printf("word found!"); 
} 
Questions connexes