Avatar billede tigertool Nybegynder
23. august 2006 - 16:35 Der er 10 kommentarer og
1 løsning

Forskel på 2 AnsiStringe

Jeg har 2 AnsiStringe - f.eks.:
AnsiString str_a = "CREATE TABLE blabla (ID INTEGER);";
AnsiString str_b = "CREATE TABLE blabla (ID INTEGER, NAME VARCHAR(80));";

Hvordan finder jeg lettest (læs: med mindst cpu og ram forbrug) forskellen i str_b som ikke er i str_a - altså ", NAME VARCHAR(80)"
Avatar billede yates Nybegynder
23. august 2006 - 16:50 #1
Hvad med simpelthen:

char* diff;
diff=str_b;
diff+=strlen(str_a)-1;

Eller -afhængig af hvor generelt dit problem er:

char* tmp1=str_a
char* tmp2=str_b
while (*tmp1==*tmp2)
  {
    tmp1++;
    tmp2++;
  }
Herefter ligger din forskel i tmp2


Y.
Avatar billede arne_v Ekspert
23. august 2006 - 17:25 #2
hvis du bare skal finde positionen for den foerste forskel saa er det ret nemt

men vil du ogsaa finde hvor de begynder at vaere ens igen ?  (rigtig diff)
Avatar billede tigertool Nybegynder
23. august 2006 - 18:51 #3
Jeg skal bare have en AnsiString retur med forskellen :)
Avatar billede mcgoat Nybegynder
23. august 2006 - 18:55 #4
så hvis du har:

AnsiString string1 = "Hej med dig din ged";
AnsiString string2 = "Hej din";

Så vil du have: "med dig ged" ?
Avatar billede tigertool Nybegynder
23. august 2006 - 19:01 #5
Ja og følgende:

AnsiString string1 = "Hej med dig din ged du lugter af ost";
AnsiString string2 = "Hej din du lugter af ost";

Så vil jeg have "med dig ged".
Avatar billede mcgoat Nybegynder
23. august 2006 - 19:25 #6
der må jeg nok stå af. men jeg er næsten sikker på arne har noget i ærmerne :)
Avatar billede mollevp Nybegynder
23. august 2006 - 20:49 #7
#include <string.h>
#include <stdio.h>

int main()
{
    char str_a[] = "Hej med dig din ged du lugter af ost";
    char str_b[] = "Hej din du lugter af ost";

    char res[80];
    memset(res, 0, 80);

    char *token_a = strtok(str_a, " ");

    while(token_a != 0)
    {
    if(strstr(str_b, token_a) == 0)
    {
        strcat(res, token_a);
            strcat(res, " ");
    }
    token_a = strtok(0, " ");
    }

    printf("%s\n", res);

    return 0;
}

--- Output ---
molle@molleServer:~/cpp/delete$ ./a.out
med dig ged

Du skal lige kigge på at allokere et resultat array der er stort nok til at alle ord kan være forskellige.. Ellers virker det her vist nogenlunde, men jeg ved ikke om det kan gøres bedre rent preformance mæssigt..
Avatar billede yates Nybegynder
24. august 2006 - 10:08 #8
Det du er ude i der er ret vanskeligt.
Hvis nu,
str_a = "Hej med dig din ged du lugter af ost";
str_b = "Hej dig med din ged du lugter af ost";

-hvorledes definerer du så det rigtige resultat (de to str er lige lange og indeholder nøjagtig de samme ord)?

Og ydeligere, hvis
str_a = "Hej med dig din ged du lugter af ost";
str_b = "Hej med dig din ged din ged du lugter af ost";
-hvorledes definerer du så det rigtige resultat (hvilken af "din ged" er den rigtige hhv forkerte)?

Du kan søge på nettet efter noget der hedder "Needleman-Wunsch-algoritmen". Det er temmeligt langhåret, men gør LIGE PRÆCIS det du vil. Det er oprindeligt noget der er udviklet til genetik og er ret besværligt at programmere.

God fornøjelse.
Y.
Avatar billede yates Nybegynder
24. august 2006 - 10:20 #9
Kan i øvrigt knytte en kommentar mere.
Hvis der kun er max EN eneste insertion et eller andet sted i str_b så kan det tænkes at det er billigt hvis du

1. bruger diff som ovenfor. Nu har du hvor de begynder at være forskellige.
2. reverterer strengene (i C hedder funktionen strrev/_strrev, C++ aner jeg ikke), og bruger diff igen
3. derefter bruger du de to diff til at beregne hvor insertionen starter og slutter

Husk at når du skal beregne hvor den slutter skal du tage højde for at diff nr 2 blev anvendt på den reverterede streng.

Y.
Avatar billede tigertool Nybegynder
02. september 2006 - 14:23 #10
Jeg benyttede mollevp's forslag.

mollevp smid et svar.
Avatar billede mollevp Nybegynder
02. september 2006 - 16:10 #11
hej tigertool: du skal nok modificere koden lidt for at få det rigtige resultat. Det er vist umiddelbart nødvendigt at køre while'en på begge strenge.
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