Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Patternilla vertailu

Hipo [10.10.2002 15:40:12]

#

Ohjelma kokeilee patternin sopivuutta merkkijonoon. Ei oo kaikista nopein tapa ollenkaan. Tukee kysymys- ja tähtimerkkejä. Eli esimerkiksi *.exe sopii kaikkiin jotka päättyy .exe ja la??as sopii kaikkiin jotka alkaa la, sen jälkeen kaks mitä tahansa ja loppuu as.

#include <iostream>

bool matchPattern(const char *pattern, const char *string) {
  while (pattern[0] || string[0]) {
    switch (pattern[0]) {
      case '*':
        pattern++;
        if (pattern[0] == '\0') return true;
        for (int i=0; i<(int) strlen(string); i++) {
          if (pattern[0] == '?' || (pattern[0] == string[i])) {
            if (matchPattern(pattern, string+i)) return true;
          }
        }
        return false;
        break;

      case '?':
        if (string == '\0') return false;
        break;

      default:
        if (pattern[0] != string[0]) return false;
        break;
    }
    pattern++;
    string++;
  }

  if (string[0] || pattern[0]) return false;
  return true;
}

int main(int argc, char *argv[]) {
  if (argc <= 2) {
    cerr << "Tahtoo kaks argumenttia." << endl;
    return -1;
  }

  bool t = matchPattern(argv[1], argv[2]);
  cout << (t ? "true":"false") << endl;
  return t;
}

Korjaaja [11.10.2002 21:37:31]

#

if (string == '\0') return false;

tilalla pitäisi varmaankin

if (*string == '\0') return false;

tai

if (string[0] == '\0') return false;

(sama asia)

Hipo [11.10.2002 22:35:59]

#

Totta, niinhän sen pitäs olla. Homma tosin näytti säkällä toimivan virheestä huolimatta, koska toi rivi onki turha, while():n tarkistuksen vuoks.

Mutta miks ihmeessä g++ ei edes varottanu (-Wall:lla) char * ja char vertailussa, vaikka siinä on melkein jopa virhe?

jonde [09.06.2003 17:07:16]

#

koska '\0' == 0, eikä "char* == 0" vertailu ole virheellinen

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta