Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Strings
Ronaldo F. Hashimoto e Carlos H. Morimoto
O objetivo desta aula introduzir o conceito de strings. Ao nal dessa aula voc dever saber: e e a Descrever o que so strings. a Descrever a distinco entre strings e vetores de caracteres. a Ler e imprimir strings. Usar recursos da string.h. Utilizar strings em seus programas.
Exemplo:
char palavra [ 1 0 0 ] ; / d e c l a r a a o de um v e t o r de c a r a c t e r e s / c
0 1 2 3 4 5 6 98 99
O nosso vetor acima poderia guardar uma frase com no mximo 100 caracteres. No nosso exemplo, o vetor a palavra guarda a sequncia de caracteres Poli. Observe que das 100 casas reservadas, a palavra Poli usa e e e somente 4 casas. Assim, precisamos designar o trmino de uma sequncia de caracteres armazenada em um string. Para isso, reservado um caractere especial para ser usado no vetor ao nal da palavra designando assim e o seu trmino. O caractere especial designado para indicar m da sequncia o caractere de cdigo ASCII 0 e e e o (zero) tambm denotado por NULL ou \0 (barra zero). Obserque que o caractere \0 no pode fazer parte de e a nenhuma sequncia. Agora, no confunda o caractere \0 (cujo cdigo ASCII zero) com o d e a o e gito 0 (cujo a cdigo ASCII 48). Note tambm que todos os caracteres depois do \0 so considerados lixo dentro do vetor. o e e
char palavra [ 1 0 0 ] ; / d e c l a r a a o de um v e t o r de c a r a c t e r e s / c printf ( " Entre com uma palavra : " ) ; scanf ( " %[^\ n ] " , palavra ) ;
Na Linha 3, temos um exemplo do uso do scanf para leitura de uma sequncia de caracteres que vai ser e armazenada no vetor (string) palavra. O usurio vai digitar uma sequncia de caracteres e depois, para terminar, a e o digita a tecla enter do teclado, que produz o caractere \n de cdigo ASCII 10. O comando scanf com %[\n] l caractere a caractere e coloca um a um em cada casa do vetor palavra; no nal, o caractere \n de cdigo e o ASCII 10 ignorado (ou seja, no colocado no vetor) e coloca-se o caractere \0 de cdigo ASCII 0 (zero). e a e o Assim, se o usurio digitar a
MAC<enter>
Note que o n mero 0 (zero) na casa 3 o cdigo ASCII do caractere \0 (proveniente da substituico do caractere u e o a \n gerado pela tecla enter por \0). Assim, para representaco do string, pode-se optar por colocar o cdigo a o a e a ASCII (nmero inteiro zero) ou o caractere entre apstrofes \0. Observe ainda que no necessrio mexer nos u o outros caracteres depois do primeiro zero , pois eles so considerados como lixo. a
char palavra [ 1 0 0 ] ; / d e c l a r a a o de um v e t o r de c a r a c t e r e s / c printf ( " Entre com uma palavra : " ) ; scanf ( " %[^\ n ] " , palavra ) ; printf ( " A palavra digitada foi : % s \ n " , palavra ) ;
Na Linha 5, temos um exemplo do uso do scanf para impresso da sequncia de caracteres armazenada no a e vetor palavra. e uma sequncia de caracteres que vai ser armazenada no vetor (string) palavra. O usurio vai digitar uma e a sequncia de caracteres e depois, para terminar, digita a tecla enter do teclado, que produz o caractere \n de e cdigo ASCII 10. O comando scanf com %[\n] l caractere a caractere e coloca um a um em cada casa do vetor o e palavra; no nal, o caractere \n de cdigo ASCII 10 e ignorado (ou seja, no colocado no vetor) e coloca-se o a e o caractere \0 de cdigo ASCII 0 (zero). Assim, se o usurio digitar o a
1 2 3 4
# include <stdio . h> # include <string . h> i n t main ( ) { . . . char palavra [ 1 0 0 ] ; / d e c l a r a a o de um v e t o r de c a r a c t e r e s / c printf ( " Entre com uma palavra : " ) ; scanf ( " %[^\ n ] " , palavra ) ; printf ( " % s tem % d caracteres \ n " , palavra , strlen ( palavra ) ) ; . . . return 0 ; }
5 6 7 8 9 10 11 12
13 14 15 16
5 6 7 8 9 10 11 12 13 14 15
16 17 18 19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# include <stdio . h> # include <string . h> i n t main ( ) { char nome [ 8 0 ] ; / s t r i n g / i n t cont1 , cont2 ; printf ( " Entre com um nome : " ) ; scanf ( " %[^\ n ] " , nome ) ; f o r ( cont1=0; nome [ cont1 ] != 0 ; cont1++); cont2 = strlen ( nome ) ; / c o n t 1 e c o n t 2 s a o i g u a i s / printf ( " % s tem % d caracteres \ n " , nome , cont1 ) ; return 0 ; }
21.6 Problema 1
Faca um programa que leia uma frase e imprima esta frase usando apenas letras mai culas. u
# include <stdio . h> i n t main ( ) { char frase [ 8 0 ] ; int i ; printf ( " Entre com uma frase : " ) ; scanf ( " %[^\ n ] " , frase ) ; f o r ( i=0; frase [ i ] != 0 ; i++) { i f ( frase [ i ] >= a && frase [ i ] <= z ) frase [ i ] = frase [ i ] ( d D ) ; } printf ( " Frase Digitada em Maiusculas : % s \ n " , frase ) ; return 0 ; }
Na Linha 8, o usurio deve digitar uma frase seguida por um enter. Esta frase armazenada no vetor frase. a e Na Linha 10, o vetor frase percorrido at encontrar o caractere \0 (cdigo ASCII zero) que indica o m e e o de string. Para cada casa do vetor, verica se uma letra minscula. Em caso armativo, transforma para e u mai scula subtraindo da diferenca entre uma letra min scula e sua correspondente mai scula (note que esta u u u diferenca a mesma para qualquer letra - neste caso, foi escolhida a letra d). e
21.7 Problema 2
Dados dois strings a e b, verique quantas so as ocorrncias do string b dentro de a. a e Exemplo: se a o string Raras araras em Araraquara e b o string ara, o seu programa deve responder 5, e e pois o string ara aparece uma vez em Raras, duas em araras e outras duas em Araraquara (e no trs j a e a
que feita a distincao entre mai sculas e min sculas). e u u Para resolver este problema, vamos fazer uma funcao que verica se um string menor encaixa em um string maior a partir do ndice ind.
i n t encaixa ( char menor [ ] , char maior [ ] , i n t ind ) { int i , j ; j=ind ; f o r ( i=0; menor [ i ] != 0 ; i++) { i f ( menor [ i ] != maior [ j ] ) { return 0 ; } j++; } return 1 ; }
Agora e somente usar esta funcao para contar quantas vezes b encaixa em a.
i n t main ( ) { char a [ 8 0 ] , b [ 8 0 ] ; i n t compr_a , compr_b , cont , i ; printf ( " Entre com uma frase a : " ) ; scanf ( " %[^\ n ] " , a ) ; printf ( " Entre com uma palavra b : " ) ; scanf ( " %[^\ n ] " , b ) ; / d e s c o b r i n d o o comprimento da f r a s e a / f o r ( compr_a =0; a [ compr_a ] != 0 ; compr_a++); / d e s c o b r i n d o o comprimento da p a l a v r a b / f o r ( compr_b =0; b [ compr_b ] != 0 ; compr_b++); f o r ( i=cont =0; i < compr_a compr_b + 1 ; i++) { cont = cont + encaixa ( b , a , i ) ; } printf ( " % s aparece em % s % d vezes \ n " , b , a , cont ) ; return 0 ; }