17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

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;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!