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.

Verificarea este posibilã dacã functia apelatã declarã si ea argumentul pointer cu<br />

const. In exemplul urmãtor avem o functie care gãseste cuvântul k dintr-un sir fãrã sã<br />

modifice sirul primit, dar foloseste functia standard “strtok”. Compilatorul semnaleazã<br />

o conversie dubioasã de pointeri, de la “const char*” la “char*”.<br />

char* kword (const char* s, int k) {<br />

char * p=s; // mai bine: p = strdup(s);<br />

p=strtok(p,” “);<br />

if (k==0 && p > 0) return p;<br />

while ( k-- && p!=NULL)<br />

p=strtok(0,” “);<br />

return p;<br />

}<br />

Solutia la problema anterioarã este fie copierea sirului primit <strong>în</strong>tr-un alt sir sau<br />

utilizarea unei alte functii <strong>în</strong> locul functiei “strtok”:<br />

Toate functiile de bibliotecã cu pointeri la date nemodificabile folosesc declaratia<br />

const, pentru a permite verificãri <strong>în</strong> alte functii scrise de utilizatori dar care folosesc<br />

functii de bibliotecã.<br />

Extragerea de cuvinte dintr-un text<br />

Un cuvânt sau un atom lexical (“token”) se poate defini <strong>în</strong> douã feluri:<br />

- un sir de caractere separat de alte siruri prin unul sau câteva caractere cu rol de<br />

separator <strong>în</strong>tre cuvinte (de exemplu, spatii albe);<br />

- un sir care poate contine numai anumite caractere si este separat de alti atomi prin<br />

oricare din caracterele interzise <strong>în</strong> sir.<br />

In primul caz sunt putini separatori de cuvinte si acestia pot fi enumerati. Pentru<br />

extragerea de siruri separate prin spatii albe (‘ ‘,’\n’,’\t’,’\r’) se poate folosi o functie<br />

din familia “scanf” (“fscanf” pentru citire dintr-un fisier, “sscanf” pentru extragere<br />

dintr-un sir aflat <strong>în</strong> memorie). Intre siruri pot fi oricâte spatii albe, care sunt ignorate.<br />

Exemplu de functie care furnizeazã cuvântul k dintr-un sir dat s:<br />

char* kword (const char* s, int k) {<br />

char word[256];<br />

while ( k >= 0) {<br />

sscanf(s,"%s",word);<br />

s=s+strlen(word);<br />

k--;<br />

}<br />

return word; // sau: return strdup(word)<br />

}<br />

Pentru extragere de cuvinte ce pot fi separate si prin alte caractere (‘,’ sau ’;’ de<br />

ex.) se poate folosi functia de biblioteca “strtok”, ca <strong>în</strong> exemplul urmãtor:

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

Saved successfully!

Ooh no, something went wrong!