Avatar billede wolffbrix Nybegynder
17. maj 2003 - 16:44 Der er 12 kommentarer og
1 løsning

Fjern ord fra en liste af ord

Hvordan kommer flg. kode til at virke?

Jeg skal fjerne nogle ord, der en angivet i stringen "negativord" fra en liste "words. Men det virker ikke, hvorfor ikke?

// fjernord fjerner de ord der er angivet i en negativliste

#include <iostream>
#include <fstream>
#include <string>
#include <list>

#include "negativliste.h"

using namespace std;

negativliste::negativliste()
{
};

void negativliste::negativ(list<string> & words, string & negativord)
{
    list<string>::iterator start = words.begin();    //der bruges iteratorer til pladsbestemmelse
    list<string>::iterator stop = words.end();
   
    for ( ; start != stop; ++start)
    {
        words.remove("negativord");
    }
};
Avatar billede soreno Praktikant
17. maj 2003 - 16:51 #1
words.remove("negativord");

skal være:

words.remove(negativord);

?
Avatar billede wolffbrix Nybegynder
17. maj 2003 - 17:50 #2
virker ikke, da der står en linie i hver liste. Så hvis man vil fjerne negativord, laver den sammenligning med listen og negativord.

f.eks. hvis en linie er:
"ja alt er godt"
og string negativord = "er";
resultatet er så "ja alt er godt"

den sammenlignigner hele stringen af gangen og ikke de enkelte ord.
Avatar billede soreno Praktikant
17. maj 2003 - 18:16 #3
Hvorfor itererer du listen igennem ?

Dette bør være nok:

void negativliste::negativ(list<string> & words, string & negativord)
{
  words.remove("negativord");
}
Avatar billede soreno Praktikant
17. maj 2003 - 18:19 #4
Se evt. dette:
#include <iostream>
#include <list>
#include <string>

using namespace std;

void delBadWord(list<string> &words, string &str)
{
    words.remove(str);
}

int main(int argc, char **argv)
{
    const char *content[] = {"Hello", "World", "Fra", "Eksperten", "!!"};
   
    list<string> words;
    list<string>::iterator iter;
   
    for(int i=0;i<5;i++)
    {
        words.push_back(content[i]);
    }

    cout << "Før kald af delBadWord()" << endl;
    for(iter=words.begin();iter!=words.end();iter++)
    {
        cout << *iter << endl;
    }
    cout << endl;
   
    string temp = content[3];
    delBadWord(words, temp);
    temp = content[2];
    delBadWord(words, temp);
   
    cout << "Efter kald af delBadWord()" << endl;
    for(iter=words.begin();iter!=words.end();iter++)
    {
        cout << *iter << endl;
    }
    cout << endl;

    return 0;
}


output er:
F°r kald af delBadWord()
Hello
World
Fra
Eksperten
!!

Efter kald af delBadWord()
Hello
World
!!
Avatar billede soreno Praktikant
17. maj 2003 - 18:22 #5
Jeg kan se der er snegen sig en copy paste fejl ind..

Det skal være:

void negativliste::negativ(list<string> & words, string & negativord)
{
  words.remove(negativord);
}
Avatar billede wolffbrix Nybegynder
17. maj 2003 - 18:36 #6
Det virker ikke ellers en god ide, men som sagt så har jeg en liste betsående af ord, og ikke som du en liste bestående af et enkelt ord på hvert index.
Avatar billede wolffbrix Nybegynder
17. maj 2003 - 18:44 #7
f.eks. har jeg en liste der indholder dette {"Første linie", "ja det er godt"}
jeg vil gerne ordet "er". Men det er en lille smule svært.
Avatar billede soreno Praktikant
17. maj 2003 - 19:06 #8
Det er jo lidt vanskeligt. Hvad nu hvis denne sætning kaldes med "en" som badword:
Denne er en gal sætning.

Skal resultatet så være:
Denne er gal sætning.

eller:
Dne er gal sætning.

?
Avatar billede wolffbrix Nybegynder
17. maj 2003 - 19:14 #9
så skal resultatet være "Denne er gal sætning"

det er deri problemmet ligger
Avatar billede segmose Nybegynder
18. maj 2003 - 13:43 #10
Så strstr dur ikke da den fil lave nr. 2, måske kan strtok bruges med adskillelsen " ,"?  se evt. www.delorie.com/djgpp/doc/libc/libc_729.html

main() {
  char *buf = "Hello there, stranger";
  char *tok;
  char *bad = "there";
  char result[strlen(buf)+1] = "";
  BOOL first = true;
  for (tok = strtok(buf, " ,");
      tok;
      tok=strtok(0, " ,")) {
    if (stricmp(tok, bad) {
      if (!first) {
        strcat(result, " ");
        first = false;
      }
      strcat(result, tok);
    }
  }
}

hvilket burde give:
hello stranger

ps. den spiser så alle "," og strtok er ikke reentrant så den dur måske ikke i threaded / interrupt applicationer.
Avatar billede wolffbrix Nybegynder
18. maj 2003 - 14:54 #11
nope løser ikke problemet, da nu har jeg en string bestående af ord, hvor jeg skal have et ord ud af gangen.
Avatar billede segmose Nybegynder
18. maj 2003 - 23:55 #12
??? hvis du insætter dette istedet for din remove kode skulle du da få det ønskede resultat (ikke testet kode nedenfor).

remove(string &buf, string bad) {
  char *tok;
BOOL first = true;
  for (tok = strtok(buf, " ,");
      tok;
      tok=strtok(0, " ,")) {
    if (stricmp(tok, bad) {
      if (!first) {
        strcat(result, " ");
        first = false;
      }
      strcat(result, tok);
    }
  }
  buf = result;
}
Avatar billede wolffbrix Nybegynder
19. maj 2003 - 18:24 #13
Har selv løst problemet vha. flg. kode:
      strcpy(string, ord.c_str());
    token = strtok(string, sep);
    while (token != NULL)
    {
       
    token = strtok(NULL, sep);    //der ledes efter det første ord
       
            }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester