strstr per trovare una parola in una stringa utilizzando c ritorno vero

Buon Giorno,

Così ho deciso di andare attraverso il mio nuovo C e ha iniziato a fare una semplice ricerca con la parola in una stringa.

Ecco il mio codice:

#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;
}

Ora il problema è che ogni volta che provo a cercare una parola in una stringa utilizzando strstr, torna sempre parola. Ho provato anche utilizzando strcmp ma che solo confrontare la prima istanza della stringa e si ferma quando non viene trovata una corrispondenza, quindi non è davvero consigliabile se si vuole fare una ricerca di parola in una stringa problema.

In realtà non ho ancora fatto un programma come questo prima, mai avuto bisogno di uno in realtà. Pertanto, vorrei chiedere perché non funziona correttamente in quanto secondo la sua descrizione strstr dovrebbe essere quello di cercare una parola in una frase o l’ho proprio capito.

Anche se avete commenti sul mio programma esitate a dirlo, in modo che io possa diventare consapevole del mio errore.

Grazie

Esempio:
parola: cane
frase: il cane è qui
deve restituire true

  • La stampa di sbagliato printf("The sentence is: %s",&sentence);
  • Mi dispiace, ma non è che quello che ho scritto?
  • Sì, lo è. Io sono la segnalazione.
  • significa che non hai bisogno di &.
  • oh, vedo, scusa, ti dispiacerebbe dirmi perché non ho bisogno di scegliere l’indirizzo? questo è quello che & è per la destra? grazie
  • “torna sempre parola” — No, è sempre la stampa “parola”, queste sono due cose totalmente diverse e cogliere che è necessario essere un programmatore. “secondo la sua descrizione strstr dovrebbe essere quello di cercare una parola in una frase, ho solo capito” — non parlare la vostra comprensione del suo valore di ritorno, quindi a quanto pare non hai letto o non prestare attenzione ad esso.

 

4 Replies
  1. 4

    Questa linea

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

    dovrebbe essere

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

    strstr() restituisce un puntatore alla prima occorrenza di word in sentence o NULL se la parola non è stato trovato.

    Per i dettagli si prega di leggere qui.


    Anche utilizzando fgets() leggere nelle “corde”, aggiunge un '\n' per la fine delle “stringhe”. Questo vieta di successo comparsion.

    Per tagliare la finale '\n' si potrebbe fare così:

    fgets(word, sizeof(word), stdin);
    {
      size_t size = strlen(word);
    
      if (size && ('\n' == word[size-1]))
      {
        word[size-1] = '\0';
      }
    }
    • Buona giornata @alk, ho provato e ancora non funzionava, funzionava solo quando la parola può essere trovato all’inizio della frase.
    • cosa proponi come alternativa a fgets?
    • Nulla, utilizzando fgets() è una scelta sicura per fare si sta facendo.
    • Una possibile alternativa sarebbe fscanf(stdin, "%99s", word);. Ma essere consapevoli del fatto che l’utilizzo senza il 99 in questo caso, rende pericoloso, in quanto potrebbe causare un buffer overflow.
    • che cosa è stdin per?
    • stdin è il stream a leggere: “Standard Input”. Lo stesso uso la tua domanda per avere fgets()da leggere.
    • Vedo, grazie per questo. 🙂

  2. 2

    Restituisce un puntatore alla prima occorrenza di str2 in str1, o un puntatore nullo se str2 non è parte di str1.

    Restituire NULL (0) significa essenzialmente che la stringa NON è stato trovato.

    Così

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

    Dovrebbe essere

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

    Fonte – http://en.cppreference.com/w/c/string/byte/strstr

    Inoltre come Armin punti fuori, non si deve utilizzare l’indirizzo operatore, &, nel printf. %s si aspetta un puntatore passato a printf e utilizzando il nome dell’array come sentence è in realtà la stessa come un puntatore all’inizio dell’array, io.e sentence == &sentence[0]

    • Perché il downvote?
  3. 1

    Il strstr() funzione trova la prima occorrenza della sottostringa “ago” nella stringa “pagliaio” e restituisce il puntatore all’inizio della sottostringa o NULL se non viene trovato.

    così il vostro se l’istruzione deve essere

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

    Nome di matrice rappresenta indirizzo di base, quindi la scrittura

    printf("%s",&word) 

    o

    printf("%s",word) 

    sia repesents indirizzo base dell’array.

  4. 0

    C’è una piccola correzione nel codice, cioè,

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

    Cambiamento: invece ==0 !=0 che equivale a !=NULL,
    in caso di puntatori 0 e NULL ” sono la stessa cosa.
    perché la parola chiave NULL è definito come:

    #define NULL ((void *)0)

    quindi modificare il codice per

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

Lascia un commento