• Nenhum resultado encontrado

Trabalhando com strings

No documento 2 Manipulando dados, vari ´aveis e express ˜ (páginas 136-141)

O primeiro cuidado que temos que tomar ao se trabalhar com strings ´e na operac¸ ˜ao de atribuic¸ ˜ao.

Strings s ˜ao arrays. Portanto, n ˜ao se pode fazer atribuic¸ ˜ao de strings. 1 # include <s t d i o . h> 2 # include < s t d l i b . h> 3 i n t main ( ) { 4 char s t r 1 [ 2 0 ] = ‘ ‘ H e l l o World ’ ’ ; 5 char s t r 2 [ 2 0 ] ; 6 7 s t r 1 = s t r 2 ; / / ERRADO! 8 9 system ( ‘ ‘ pause ’ ’ ) ; 10 r e t u r n 0 ; 11 }

Isso ocorre porque uma string ´e um array e a linguagem C n ˜ao suporta a atribuic¸ ˜ao de um array para outro. Para atribuir o conte ´udo de uma string a outra, o correto ´e copiar a string elemento por elemento para a outra string.

Exemplo: Copiando uma string 1 # include <s t d i o . h> 2 # include < s t d l i b . h> 3 i n t main ( ) { 4 i n t count ; 5 char s t r 1 [ 2 0 ] = ‘ ‘ H e l l o World ’ ’ , s t r 2 [ 2 0 ] ;

6 f o r ( count = 0 ; s t r 1 [ count ] ! = ’ \0 ’ ; count ++)

7 s t r 2 [ count ] = s t r 1 [ count ] ; 8 s t r 2 [ count ] = ’\0 ’ ;

9 system ( ‘ ‘ pause ’ ’ ) ; 10 r e t u r n 0 ;

11 }

O exemplo acima permite copiar uma string elemento por elemento para outra string. Note que foi utilizada a mesma forma de indexac¸ ˜ao que seria feita com um array de qualquer outro tipo (int, float, etc). Infelizmente,

esse tipo de manipulac¸ ˜ao de arrays n ˜ao ´e muito pr ´atica quando estamos trabalhando com palavras.

Felizmente, a biblioteca padr ˜ao da linguagem C possui func¸ ˜oes especialmente desenvolvidas para a manipulac¸ ˜ao de strings na biblioteca<string.h>.

A seguir, ser ˜ao apresentadas algumas das func¸ ˜oes mais utilizadas para a leitura, escrita e manipulac¸ ˜ao de strings.

6.2.1 LENDO UMA STRING DO TECLADO

USANDO A FUNC¸ ˜AO SCANF()

Existem v ´arias maneiras de se fazer a leitura de uma sequ ˆencia de carac- teres do teclado. Uma delas ´e utilizando a j ´a conhecida func¸ ˜ao scanf()

com o formato de dados “%s”:

char str[20];

scanf(“%s”,str);

Quando usamos a func¸ ˜ao scanf() para ler uma string, o

s´ımbolo de & antes do nome da vari ´avel n ˜ao ´e utilizado. Os colchetes tamb ´em n ˜ao utilizados pois queremos ler a string toda e n ˜ao apenas uma letra.

Infelizmente, para muitos casos, a func¸ ˜ao scanf() n ˜ao ´e a melhor opc¸ ˜ao

para se ler uma string do teclado.

A func¸ ˜aoscanf() l ˆe apenas strings digitadas sem espac¸os,

ou seja, palavras.

No caso de ter sido digitada uma frase (uma sequ ˆencia de caracteres con- tendo espac¸os), apenas os caracteres digitados antes do primeiro espac¸o encontrado ser ˜ao armazenados na string se a sua leitura for feita com a func¸ ˜aoscanf().

USANDO A FUNC¸ ˜AO GETS()

Uma alternativa mais eficiente para a leitura de uma string ´e a func¸ ˜ao

gets(), a qual faz a leitura do teclado considerando todos os caracteres

digitados (incluindo os espac¸os) at ´e encontrar uma tecla enter:

char str[20];

gets(str);

USANDO A FUNC¸ ˜AO FGETS()

Basicamente, para se ler uma string do teclado utilizamos a func¸ ˜aogets().

No entanto, existe outra func¸ ˜ao que, utilizada de forma adequada, tamb ´em permite a leitura de strings do teclado. Essa func¸ ˜ao ´e a fgets(), cujo

prot ´otipo ´e:

char *fgets (char *str, int tamanho, FILE *fp);

A func¸ ˜aofgets() recebe 3 par ˆametros de entrada

• str: a string a ser lida;

• tamanho: o limite m ´aximo de caracteres a serem lidos;

• fp: a vari ´avel que est ´a associado ao arquivo de onde a string ser ´a lida.

e retorna

• O ponteiro para o primeiro caractere da string recuperada em str. Note que a func¸ ˜aofgets() utiliza uma vari ´avel FILE *fp, que est ´a associado

ao arquivo de onde a string ser ´a lida.

Para ler do teclado, basta substituir FILE *fp por stdin,

o qual representa o dispositivo de entrada padr ˜ao (geral- mente o teclado). 1 # include <s t d i o . h> 2 # include < s t d l i b . h> 3 i n t main ( ) { 4 char nome [ 3 0 ] ; 5 p r i n t f ( ‘ ‘ D i g i t e um nome : ’ ’ ) ; 6 f g e t s ( nome , 30 , s t d i n ) ;

7 p r i n t f ( ‘ ‘O nome d i g i t a d o f o i : %s ’ ’ ,nome ) ; 8 system ( ‘ ‘ pause ’ ’ ) ;

9 r e t u r n 0 ;

10 }

Como a func¸ ˜aogets(), a func¸ ˜ao fgets() l ˆe a string do teclado at ´e que um

caractere de nova linha (ENTER) seja lido. Apesar de parecerem iguais, a func¸ ˜ao fgets possui algumas diferenc¸as e vantagens sobre agets().

Na func¸ ˜ao fgets(), o caractere de nova linha (‘\n’) far ´a

parte da string, o que n ˜ao acontecia comgets().

A func¸ ˜aogets() armazena tudo que for digitado at ´e o comando de enter.

J ´a a func¸ ˜aofgets() armazena tudo que for digitado, incluindo o comando

de enter (‘\n’).

A func¸ ˜aofgets() espec´ıfica o tamanho m ´aximo da string de

entrada.

Diferente da func¸ ˜aogets(), a func¸ ˜ao fgets() l ˆe a string at ´e que um carac-

tere de nova linha seja lido ou “tamanho-1” caracteres tenham sido lidos. Isso evita o estouro do buffer, que ocorre quando se tenta ler algo maior do que pode ser armazenado na string.

´

As vezes, podem ocorrer erros durante a leitura de caracteres ou strings do teclado. Para resolver esse pequenos erros, podemos limpar o buffer do teclado (entrada padr ˜ao) usando a func¸ ˜aosetbuf(stdin, NULL) antes

de realizar a leitura de caracteres ou strings:

Exemplo: limpando o buffer do teclado leitura de caracteres leitura de strings

1 char ch ; 2 s e t b u f ( s t d i n , NULL ) ; 3 s c a n f ( ‘ ‘ % c ’ ’ , &ch ) ; 1 char s t r [ 1 0 ] ; 2 s e t b u f ( s t d i n , NULL ) ; 3 g e t s ( s t r ) ;

Basicamente, a func¸ ˜ao setbuf() preenche um buffer (primeiro par ˆametro)

com um determinado valor (segundo par ˆametro). No exemplo acima, o buffer da entrada padr ˜ao (stdin), ou seja, o teclado, ´e preenchido com

o valor vazio (NULL). Na linguagem C a palavra NULL ´e uma constante

padr ˜ao que significa um valor nulo. Um buffer preenchido com NULL ´e

considerado limpo/vazio.

6.2.2 ESCREVENDO UMA STRING NA TELA

USANDO A FUNC¸ ˜AO PRINTF()

Basicamente, para se escrever uma string na tela utilizamos a func¸ ˜ao

printf() com o formato de dados “%s”: char str[20] = “Hello World”;

printf(“%s”,str);

Para escrever uma string, utilizamos o tipo de sa´ıda “%s”. Os colchetes n ˜ao s ˜ao utilizados pois queremos escrever a string toda e n ˜ao apenas uma letra.

USANDO A FUNC¸ ˜AO FPUTS()

No entanto, existe uma outra func¸ ˜ao que, utilizada de forma adequada, tamb ´em permite a escrita de strings. Essa func¸ ˜ao ´e afputs(), cujo prot ´otipo

int fputs (char *str,FILE *fp);

A func¸ ˜aofputs() recebe 2 par ˆametros de entrada

• str: a string (array de caracteres) a ser escrita na tela;

• fp: a vari ´avel que est ´a associado ao arquivo onde a string ser ´a es- crita.

e retorna

• a constante EOF (em geral, -1), se houver erro na escrita; • um valor diferente de ZERO, se o texto for escrito com sucesso. Note que a func¸ ˜aofputs() utiliza uma vari ´avel FILE *fp, que est ´a associado

ao arquivo onde a string ser ´a escrita.

Para escrever no monitor, basta substituir FILE *fp por st-

dout, o qual representa o dispositivo de sa´ıda padr ˜ao (ge-

ralmente a tela do monitor).

1 # include <s t d i o . h> 2 # include < s t d l i b . h> 3 i n t main ( ) { 4 char t e x t o [ 3 0 ] = ‘ ‘ H e l l o World \n ’ ’ ; 5 f p u t s ( t e x t o , s t d o u t ) ; 6 system ( ‘ ‘ pause ’ ’ ) ; 7 r e t u r n 0 ; 8 }

No documento 2 Manipulando dados, vari ´aveis e express ˜ (páginas 136-141)

Documentos relacionados