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.