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.
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: