Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
}<br />
strdel (p,strlen(s1)); // sterge caractere de la adr p<br />
strins(p,s2); // insertie de caractere la p<br />
In exemplul anterior am presupus cã sirul nou s2 nu contine ca subsir pe s1, dar<br />
mai sigur este ca sã mãrim adresa din “p” dupã fiecare <strong>în</strong>locuire:<br />
p=line;<br />
while(p=strstr (p,s1)) { // cauta un s1 de la p<br />
strdel (p,strlen(s1));<br />
strins(p,s2);<br />
p=p+ strlen(s2);<br />
}<br />
Uneori se cautã siruri care se “potrivesc” (“match”) cu o mascã (cu un sablon) care<br />
contine si caractere speciale pe lângã caractere obisnuite. Cea mai cunoscutã formã de<br />
mascã este cea care foloseste caracterele “wildcards” ‘*’ si ‘?’, cu semnificatia “subsir<br />
de orice lungime si orice caractere” si respectiv “orice caracter”. O mascã se poate<br />
potrivi cu multe siruri diferite (<strong>în</strong> continut dar si <strong>în</strong> lungime).<br />
Aceastã mascã este folositã <strong>în</strong> principal la selectarea de fisiere dintr-un director fie<br />
<strong>în</strong> comenzi sistem, fie <strong>în</strong> functii de bibliotecã (“findfirst” si “findnext”, pentru cãutarea<br />
de fisiere).<br />
Exemple de cãutare cu mascã (primul argument este masca de cãutare):<br />
match (“a?c?”, “abcd”); // da<br />
match (“?c*”, “abcd”); // da<br />
match (“*ab*”, “abcd”); // da<br />
match (“*?*”, “abcd”); // da<br />
O functie pentru potrivirea unui sir dat cu o mascã este un exemplu de functie greu<br />
de validat, datoritã diversitãtii de situatii <strong>în</strong> care trebuie testatã (verificatã). Exemplu<br />
de functie recursivã pentru potrivire cu caractere “wildcard”:<br />
int match (char* pat, char* str) { // pat=pattern, str=string<br />
while (*str) {<br />
switch (*pat) {<br />
case '?':<br />
if (*str == '.') return 0; // pentru nume de fisiere !<br />
break;<br />
case '*':<br />
do { ++pat; } while (*pat == '*'); // caractere * succesive<br />
if (!*pat) return 1;<br />
while (*str) if (match(pat, str++)) return 1;<br />
return 0;<br />
default: // orice caracter diferit de ? sau *<br />
if (toupper(*str) != toupper(*pat)) return 0; // daca difera<br />
break;