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; }
if (string == '\0') return false;
tilalla pitäisi varmaankin
if (*string == '\0') return false;
tai
if (string[0] == '\0') return false;
(sama asia)
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?
koska '\0' == 0, eikä "char* == 0" vertailu ole virheellinen
Aihe on jo aika vanha, joten et voi enää vastata siihen.