Toon posts:

[VC++] CStrings gedeeltelijk vergelijken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Is er voor de SQL statement LIKE ook een vervanger voor in VC++? (Dus zonder SQL te gebruiken in VC++)

Ik wil graag 2 Cstrings gedeeltelijk vergelijken met elkaar.
Ik vond de operatie Compare van CString maar die kan volgens mij alleen maar aangeven of hij hetzelfde is of niet. Ik wil dus graag zo een string vergelijken:

zoek op: Jans*
resultaten: Jansen, Klaas; Janssen, Kees enz.

maar ook graag:

Zoek op: Jan*
resultaten: Jansen, Klaas; Appel, Jan enz.

Weet iemand of dit mogelijk is? en zo ja hoe?

Vriendelijk bedankt,

Dustin

  • Grum
  • Registratie: Juni 2001
  • Niet online
dan zoek je op *Jan* :?

Verwijderd

Topicstarter
Op zondag 07 april 2002 11:45 schreef Grum het volgende:
dan zoek je op *Jan* :?
Ja, idd. Maar met welke operatie vergelijk ik die CStrings dan? Met compare werken de * toch niet?

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Is er geen regexp functie die je kunt gebruiken (ben c++ n00b, dus...)?

Verwijderd

Gebruik de Find() method.

Zie help CString.

Verwijderd

Topicstarter
Op zondag 07 april 2002 12:18 schreef Otis het volgende:
Gebruik de Find() method.

Zie help CString.
Dat lijkt er inderdaad op. Helaas krijg ik die niet echt werkend. Heb je misschien een voorbeeld?
Bij mij blijft er -1 uitkomen.

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Op zondag 07 april 2002 20:53 schreef duvadesa het volgende:

[..]

Dat lijkt er inderdaad op. Helaas krijg ik die niet echt werkend. Heb je misschien een voorbeeld?
Bij mij blijft er -1 uitkomen.
humm.. als je zoekt naar *jan* is dat niet net zoals zoeken naar jan ....?

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Topicstarter
Op zondag 07 april 2002 20:59 schreef _Mo_ het volgende:

[..]

humm.. als je zoekt naar *jan* is dat niet net zoals zoeken naar jan ....?
ja, dat mag uiteraard ook. Het is maar dat hij een gedeeltelijke string vergelijkt.

Verwijderd

Volgens mij bestaat er niets in de vorm van reguliere expressies in C/C++... Dus zul je toch je eigen algoritme moeten schrijven om dit uit te zoeken denk ik ;)

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int Match(CString a_Pattern, CString a_String)
{
    char wild[260];
    char string[260];

    sprintf(wild,"%s",a_Pattern);
    sprintf(string,"%s",a_String);
    return WildCmp(wild,string);
}

int WildCmp(char *wild, char *string) {
    char *cp, *mp;
    
    while ((*string) && (*wild != '*')) {
        if ((*wild != *string) && (*wild != '?')) {
            return 0;
        }
        wild++;
        string++;
    }
        
    while (*string) {
        if (*wild == '*') {
            if (!*++wild) {
                return 1;
            }
            mp = wild;
            cp = string+1;
        } else if ((*wild == *string) || (*wild == '?')) {
            wild++;
            string++;
        } else {
            wild = mp;
            string = cp++;
        }
    }
        
    while (*wild == '*') {
        wild++;
    }
    return !*wild;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

maak daar maar even const char * van, aangezien je een CString niet zomaar kunt converteren naar een char * :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op zondag 07 april 2002 23:45 schreef OiSyN het volgende:
maak daar maar even const char * van, aangezien je een CString niet zomaar kunt converteren naar een char * :)
Hij doet het anders wel hoor :)

of kun je WildCmp(..) rechtstreeks gebruiken met CString als ie const chars gebruikt

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

oh wacht ik keek even verkeerd naar je post... ik zag niet dat je eerst die inhoud kopieerde naar char arrays (met sprintf nog wel.. erg omslachtig. Bovendien heb je gewoon mazzel dat het toevallig werkt)

ja, als je const char * gebruikt dan kun je gewoon de CStrings meegeven, dat is idd wat ik dacht dat je bedoelde :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op maandag 08 april 2002 00:40 schreef OiSyN het volgende:
oh wacht ik keek even verkeerd naar je post... ik zag niet dat je eerst die inhoud kopieerde naar char arrays (met sprintf nog wel.. erg omslachtig. Bovendien heb je gewoon mazzel dat het toevallig werkt)

ja, als je const char * gebruikt dan kun je gewoon de CStrings meegeven, dat is idd wat ik dacht dat je bedoelde :)
Das wel een veel mooiere oplossing jah. Dit was de enige manier die ik kon verzinnen om van een CString een char * te maken. Ben niet zo into char * :)

die WildCmp heb ik trouwens van coreproject. Wel relaxde url voor MFC programmeurs

Verwijderd

Op zondag 07 april 2002 21:09 schreef duvadesa het volgende:

[..]

ja, dat mag uiteraard ook. Het is maar dat hij een gedeeltelijke string vergelijkt.
Als je substring 'Jan' zoekt, dan zullen 'Janssen', 'Jan Pieterse' etc. matchen.

Verwijderd

nog een wildcard functie
je kan een 'char' meegeven als vervanging van een karakter (wc_s) of voor een hele string (wc_m)

(dword is gewoon een unsigned int)
(err is gewoon byte)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
err str_wildcard(char *dest, char *source, char wc_s, char wc_m, bool case_s)
{
   dword dcur, scur;
  if ((!dest) || (!source))
    return 0;
  for (dcur = 0, scur = 0; true; dcur++, scur++)
  {
    if (dest[dcur] == wc_m)
    {
    if (!dest[dcur + 1])
      return STR_CMP_EQUAL;
    while (true)
    {
      if (!source[scur])
        return 0;
      if (str_wildcard((dest + dcur + 1), (source + scur), wc_s, wc_m, case_s) == STR_CMP_EQUAL)
        return STR_CMP_EQUAL;
      scur++;
    }
    }
    if (!source[scur])
    if (!dest[dcur])
      return STR_CMP_EQUAL;
    else
      return 0;
    if (dest[dcur] != wc_s)
    if (case_s)
    {
      if (dest[dcur] != source[scur])
        return 0;
    }
    else
      if (chr_to_lower(dest[dcur]) != chr_to_lower(source[scur]))
        return 0;
  }
}
Pagina: 1