2.6.2. Functia scanf - Litera s

2019/01/11 in Programare in C

Specificatorii de format terminati in s se folosesc pentru a citi siruri de caractere.

La citirea cu un astfel de specificator de format, data se considera ca facand parte dintr-un camp care incepe cu un caracter care nu este alb si care se termina fie la caracterul care urmeaza dupa un camp alb, fie la caracterul prin care se ajunge la lungimea maxima de caractere indicata de specificatorul de format.

Caracterele citite se pot pastra intr-o zona de memorie organizata ca un tablou de caractere. In acest caz, parametrul corespunzator specificatorului de format poate fi chiar numele acestui tablou.

Important! Dupa ultimul caracter citit sub controlul unui astfel de specificator de format se pastreaza automat caracterul NUL ('\0').

Exemple:

1. Fie textul:

Limbajul C++

tastat pe un acelasi rand la terminalul standard.

Daca tab1 si tab2 sunt declarate ca mai jos:

char tab1[10];
char tab2[4];

atunci textul de mai sus poate fi citit folosind expresiile:

scanf("%s", tab1);
// se citeste textul Limbajul
// campul incepe cu litera L si se termina cu l
// deoarece dupa l urmeaza spatiu

scanf("%s, tab2");
// se citeste textul C++
// campul incepe cu litera C si se termina
// cu cel de-al doilea caracter + deoarece dupa el
// urmeaza newline

Acelasi lucru se poate realiza folosind un singur apel a lui scanf cu doi specificatori de format:

scanf("%s %s",tab1,tab2);

Spatiul alb dintre specificatorii de format nu este esential, el se neglijeaza. Deci acelasi apel poate fi scris sub forma:

scanf("%s%s",tab1,tab2);

Datele citite prin aceste apeluri se pastreaza in memorie prin codurile lor ASCII astfel:

tab1[0] -> 'L' tab1[1] -> 'i' tab1[2] -> 'm'
tab1[3] -> 'b' tab1[4] -> 'a' tab1[5] -> 'j'
tab1[6] -> 'u' tab1[7] -> 'l' tab1[8] -> '\0'
tab2[0] -> 'C' tab2[1] -> '+' tab2[2] -> '+'
tab2[3] -> '\0'

2. Fie declaratiile:

char tab1[10];
char tab2[10];

si apelul:

scanf("%2s%9s",tab1,tab2);

Presupunem ca la terminalul standard sa tastat cuvantul necunoscut precedat si urmat de cel putin un caracter alb.

In acest caz, functia scanf realizeaza urmatoarele:

In concluzie, dupa apelul de mai sus vom avea:

tab1[0] -> 'n' tab1[1] -> 'e' tab1[2] -> '\0'
tab2[0] -> 'c' tab2[1] -> 'u' tab2[2] -> 'n'
tab2[3] -> 'o' tab2[4] -> 's' tab2[5] -> 'c'
tab2[6] -> 'u' tab2[7] -> 't' tab2[8] -> '\0'

3. Specificatorul:

%1s

permite citirea unui singur caracter.

O prima deosebire dintre acesta si specificatorul %c consta in aceea ca, in timp ce %1s citeste primul caracter care nu este alb, specificatorul %c citeste caracterul curent, indiferent daca este alb sau nu. Cei doi specificatori citesc acelasi lucru numai in cazul in care caracterul curent nu este alb.

O a doua deosebire dintre cei doi specificatori consta in aceea ca specificatorul %1s implica memorarea caracterului NUL, dupa caracterul citit, ceea ce nu are loc in cazul specificatorului %c.

De aceea secventa:

char car;
...
scanf("%c",&car);

este diferita de secventa:

char car[2];
...
scanf("%1s",car);

2.6.3. Functia scanf - Litera d