Gå til innhold

Å søke etter et ord i en tekst i c++


Anbefalte innlegg

Jeg har laget denne koden:

#include <iostream>
using namespace std;

void finn(char *tekst, char *ord, int &antall);

int main()
{
char tekst[100]="Once upon a time in Mexico...";
char ord[100]="in";
int tall=0;

finn(tekst, ord, tall);
cout<< tekst << endl << "Ordet " << ord << ", finnes " << tall << " ganger.";
}

void finn(char *tekst, char *ord, int &antall)
{
int lengde_tekst=strlen(tekst);
int lengde_ord=strlen(ord);

int i;
int x;
 for(i=0;i < lengde_tekst;i++)
 {
         for(x=0;x < lengde_ord;x++)
         {
                   if(tekst[i]==ord[x] && tekst[i+1]==ord[x+1])
                   {
                                       antall++;
                   }
         }
 }
                   
}

Men den kan bare finne et ord på to bokstaver, hva må jeg gjøre for å få en mere dynamisk søkefunksjon slik at jeg kan søke etter et ord uansett lengde?

 

EDIT: Etter jeg hadde tenkt meg litt om fant jeg ut at jeg kunne ha brukt switch, men går det an å få samme effekt uten å bruke switch?

Endret av willbend
Lenke til kommentar
Videoannonse
Annonse

Har ikke tid til noe langt svar, men hva er det du ønsker å oppnå?

1. Skrive en søkerutine selv, for å trene på programmering?

2. Skrive en mest mulig optimal søkerutine?

3. Du trenger en søkealgoritme?

 

Om det er nummer 3, så finnes det en ferdig metode i standard template library. (Bruk google.)

Lenke til kommentar

har ikke tid til å skrive i c kode så jeg skriver i psudo kode

 

1. finn lengden på stringen som skal søkes etter (string1)

2 finn lengden på stringe som skal søkes i (string2)

3 søk etter etter string1[0] i string2

4 hvis man finner første byte fra string1 i string2 gjenta steg 3 med string[2] osv.

5 hvis indexen i string1 < lengden av string1 da finner string1 i stirng 2

Lenke til kommentar

Utestet, som vanlig, men tror den skulle være inne på noe ihvertfall

 

void finn(char *tekst, char *ord, int &antall)
{
 int lengde_tekst=strlen(tekst);
 int lengde_ord=strlen(ord);
 bool match;
 for(int i=0;i<lengde_tekst-lengde_ord+1;i++) // Det må være igjen nok bokstaver til at "ord" kan forekomme
 {
   match = true;
   for(int x=0;x<lengde_ord;x++)
   {
     if(tekst[i+x] != ord[x])
       {
         match = false;
         break;
       }
    }
    if(match) antall++;
  }               
}

Endret av Nazgul
Lenke til kommentar
Har ikke tid til noe langt svar, men hva er det du ønsker å oppnå?

1. Skrive en søkerutine selv, for å trene på programmering?

2. Skrive en mest mulig optimal søkerutine?

3. Du trenger en søkealgoritme?

 

Om det er nummer 3, så finnes det en ferdig metode i standard template library. (Bruk google.)

5184781[/snapback]

Det var vel mest for å trene pluss at jeg var nysgjerrig.

Lenke til kommentar
Det var vel mest for å trene pluss at jeg var nysgjerrig.

5185921[/snapback]

Hvis det var mest treningen så er Nazgul sin metode intuitiv og grei nok (selv om jeg er usikker på hvorfor du legger på 1 i for-løkketesten, Nazgul), men den er naiv.

 

Hvis du er nysjerrig på en litt smartere søkealgoritme kan du google litt etter Boyer-Moore, for eksempel. Eller et generelt søk etter "string matching", finnes mange kjappe algoritmer og noen er mer spesialiserte.

 

Lykke til!

Lenke til kommentar

Her er en enkel og fungerende (trur eg)

#include <iostream>

int search_linear(char *string,char *search){
for (int i=0;string[i]!=0;i++){
 int match=1;
 for (int j=0;search[j]!=0;j++) 
 	if (string[i+j]!=search[j]){
   match=0;
   break;
 	}
 if (match==1) return i;
}
}


int main(){

char *string="Dette er en test";
char *search="er";
std::cout << "search_linear: " << search_linear(string,search) << std::endl;
return 0;
}

edit: Den vil antagelig kræsje dersom den får delvis match helt i slutten

Endret av JBlack
Lenke til kommentar
edit: Den vil antagelig kræsje dersom den får delvis match helt i slutten

5189691[/snapback]

Vel, ikke sikkert den vil kræsje, men du vil komme til å lese forbi teksten som er allokert, og du kan få en exception (i debug-modus, i alle fall i VC7.1, får du garantert exception, mener jeg). Du er i alle fall ikke garantert å få det resultatet du forventer.

 

Nazgul sin kode mener jeg fungerer bra for et enkelt strengsøk (når jeg bare fikk vridd hodet rundt +1 i for-løkka :) ).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...