Está en la página 1de 11

Tratamento de strings

Reviso
Conceito de strings
Na linguagem C uma string corresponde a uma
vetor do tipo char que armazena um texto
terminado pelo caractere(\0)
Ou seja, uma string uma cadeia de
caracteres (bytes) alocados de forma sequencial
e contgua. Cada caractere um elemento
independente que pode ser acessado por meio
de um ndice.
O tamanho fsico de uma string dado pelo
nmero de caracteres que ela comporta mais 1
(que ocupado pelo delimitador \0)
Exemplos de strings
A declarao abaixo refere-se a um vetor de nome
faculdade de no mximo 19 caracteres (porque deve
haver espao para o delimitador)

char faculdade[20]=FATEC SO CAETANO;

Neste caso os 20 bytes so alocados, mas se


observarmos bem, apenas 18 bytes so usados e 17
correspondem efetivamente ao seu contedo
Exemplos de strings (cont)
Se modificarmos a declarao anterior como se segue:

char faculdade[]=FATEC SO CAETANO;

O vetor faculdade teria 18 caracteres, que o espao


necessrio e suficiente para acomodar a string entre aspas.
Quando o contedo inicial de um vetor vai ser estabelecido
imediatamente aps a sua declarao, no necessrio, a
menos que se deseje, fornecer o tamanho.
O compilador capaz de calcular e reservar o espao
necessrio.
Exemplos de strings (cont)
Conforme dissemos uma string corresponde a um
vetor de caracteres que podem ser acessados
individualmente, ento a declarao a seguir tambm
vlida:

char fruta[]={A,M,O,R,A,\0};
que equivale declarao:
char fruta[]=AMORA;// aqui o delimitador implcito

Qual o tamanho do vetor nos 2 casos?


Funes para leitura
Considerando a declarao:
char aluno[21];
Temos:
scanf( %s, aluno); //l uma string e armazena o seu contedo no endereo
dado pela varivel aluno (Note que a palavra aluno j um endereo por se
tratar do nome de um vetor, sendo desnecessrio o uso do &)
o inconveniente deste comando que a leitura termina quando um enter ou um
espao em branco encontrado, o que restringe
bastante o seu uso (para leitura de frases ou nomes compostos).

gets(aluno); //obtm uma string e armazena o seu contedo na varivel aluno.


O comando gets permite a leitura de frases ou nomes compostos, o que oferece
vantagem sobre a forma anterior do scanf()

PROBLEMA: ambas as construes acima permitem a leitura de mais


de 21 caracteres (que o tamanho definido para a varivel),
podendo ocorrer erro de execuo por invaso de reas de
memria alm daquela previamente reservada.
Funes para leitura (cont)
Sugesto:
Para resolver os problemas mencionados no slide
anterior podemos usar a seguinte sintaxe:
char aluno[21];
...
scanf( %20[^\n], aluno);
Por mais estranho que possa parecer, este comando pede
para que seja procurado no buffer de teclado (sim, porque
scanf() procura informaes a) e transferido para o endereo
aluno qualquer caractere diferente (^) de enter (\n), e
impondo ainda um limite de at 20 bytes para a transferncia.
NOTA: O espao em branco antes da % indica que brancos e
caracteres de tabulao sejam desprezados antes do inicio do
texto.
Funes de manipulao de strings
A linguagem C oferece diversas funes (disponveis
na biblioteca string.h) para o tratamento de strings:
So:
strlen(<str>); //retorna o tamanho da str
strcpy(<str1>,<str2>); //copia str2 em str1
strcat (<str1>,<str2>);// concatena str2 em str1
strcmp(<str1>,<str2>);// compara str1 com str2
// se (str1=str2) retorna zero
// se(str1<str2) retorna negativo
//se (str1>str2) retorna positivo
e outras....
Funes de manipulao de strings
Vale lembrar, que em C, as strings merecem ateno
especial.
Por exemplo, ddos:
char s1[10], s2[10];
//todos os comandos abaixo so invlidos
s1=alfa; //atribuio
s2=s1;//atribuio
if (s1==s2) printf(iguais);//comparao

O correto seria:
strcpy(s1,alfa); // copia a palavra alfa para a string s1
strcpy(s2,s1); // copia a string s1 para a string s2
if(strcmp(s1,s2)==0) printf(iguais); //compara se as
strings tem contedos iguais
Funes de manipulao de strings
- caractere a caractere
O que faz a funo abaixo?

int tam (char *s){


int n=0;
for(int i=0; s[i]!=\0; i++)
n++;
return n;
}
Funes de manipulao de strings
- caractere a caractere
O que faz a funo abaixo?

void grud (char *dest, char *orig){


int i;
for(i=0; orig[i]!= \0 ; i++)
dest[i]=orig[i];
dest[i]=\0;
}

También podría gustarte