Strings e vetores de caracteres 1 Resumo: O uso de strings facilita a manipulac ao de palavras e textos. Strings s ao basicamente vetores do tipo char , por em diferentemente de simples vetores, strings s ao terminadospor um caractere \0. Utilize %s para ler e imprimir strings nas func oes scanf e printf . Voc e pode utilizar strings constantes para carregar vetores de caracteres na sua declarac ao. Uma constante do tipo string e denida por uma seq u encia de caracteres entre aspas (lembre-se que uma constante do tipo char e um caractere entre ap ostrofes). 2 Descric ao: Nessa lic ao vamos estudar como palavras (seq u encias de caracteres) s ao tratadas no C. Primeiro, vamos analisar um programa que carrega um vetor com n caracteres e os imprime logo em seguida: #define MAX 100 #include <stdio.h> #include <stdlib.h> int main () { int i; char vet[MAX]; printf("Digite o tamanho do vetor: "); scanf("%d", &n); prinft("Digite a sequencia de caracteres: "); for ( i=0 ; i<n ; i++ ) scanf("%c", &vet[i]); prinft("A palavra que voce digitou foi: "); for ( i=0 ; i<n ; i++ ) printf("%c", vet[i]); system("pause"); return 0; } Imagine um usu ario precisando digitar seu nome para um formul ario, e o computador pedindo para que ele, primeiramante, digite o n umero de caracteres a serem lidos, como no exemplo acima. Isso complica muito uma atividade que, a princpio, e bastante simples. Uma forma de contornar esse problema seria utilizar um caractere especial como marcador, como por exemplo, um ponto (.). Nesse caso, o computador poderia imprimir uma mensagem como: Digite seu nome terminado por um ponto. Obviamente, nenhuma pessoa poderia ter um . em seu nome, e essa soluc ao provavelmente n ao seria apropriada para entrar frases, ou textos com pontuac ao. Strings s ao vetores de caracteres terminados por um caractere especial, o \0 (barra zero). Esse caractere indica o nal da palavra ou texto e e normalmente tratado pelo pr oprio computador, facilitando assim a manipulac ao de palavras. 3 Entrada e sada Em C utiliza-se a seq u encia %s para ler (usando scanf ) e imprimir (usando printf ) strings . 4 Exemplos Na linguagem C, podemos inicializar strings colocando a seq u encia de caracteres entre aspas, como mostra o exemplo abaixo (tente descobrir a sada desse programa antes de continuar): #include <stdio.h> #include <stdlib.h> #define MAX 100 int main () { / * Declaracoes * / int i; char texto[MAX] = "apenas um exemplo."; printf("%s\n", texto); for (i=0; i<5; i++) texto[i] = i + i; printf("%s\n", texto); system ( "pause" ); return 0; } 4.1 Descric ao do programa O vetor texto de caracteres, quando carregado, recebe automaticamente pelo compilador um caractere \0, como mostrado abaixo (as posic oes com ? n ao foram inicializadas, ou seja, seu conte udo e desconhecido): texto: a p e n a s u m e x e m p l o . \0 ? ? posic ao: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 O primeiro printf imprime o string apenas um exemplo., ou seja, percorre o vetor texto e imprime os seus caracteres uma um, at e encontrar umcaractere \0. Umtrecho de c odigo equivalente a printf("%s\n", texto) seria: i = 0; while (texto[i] != \0) { printf("%c", texto[i]); i++; } printf("\n"); ou ainda, usando um comando for : 2 for (i=0; texto[i] != \0; i++) printf("%c", texto[i]); printf("\n"); Observe que, sem o uso de strings , precisamos conhecer o n umero de caracteres a serem impressos, e que o uso de %ssimplica bastante a impress ao de strings . Al em do c odigo de terminac ao (\0), n ao h a diferenca entre strings e vetores de caracteres, ou seja, strings podem ser considerados vetores de caracteres terminados por um caractere \0, como ilustrado pelo primeiro for do programa, que coloca nas posic oes 0 a 4 do vetor texto os caracteres i, j, k, l, m), ou seja, o vetor texto caria assim: texto: i j k l m s u m e x e m p l o . \0 ? ? posic ao: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 e o string impresso pelo ultimo printf seria ijklms um exemplo.. OBSERVAC
AO: quando dizemos que o string e terminado por um \0, signica que a parte v alida dos dados est a antes desse caractere especial. As posic oes ap os o \0, permanecem vazias, e podem ser utilizadas quando o vetor e utilizado, por exemplo, para armazenar um outro string de maior comprimento. 4.2 Um outro exemplo Vamos ver agora um programa que l e uma palavra e imprime os caracteres na ordem inversa a de leitura sem o uso de strings , apenas para realcar a diculdade de tratar palavras quando os caracteres s ao lidos um a um: #include <stdio.h> #include <stdlib.h> #define MAX 100 int main () { / * Declaracoes * / int i,n; char frase[MAX]; printf("Digite o numero de caracteres de seu texto: "); scanf ("%d", &n); printf("Digite o seu texto:\n"); for (i=0; i<n; i++) scanf(" %c", &frase[i]); / * importante ter um espaco antes de %c * / printf("O seu texto na ordem inversa: \n"); for (i=n-1; i>=0; i--) printf("%c", frase[i]); printf("\n"); system ( "pause" ); return 0; } Observe que o programa precisa saber o n umero de caracteres a serem lidos, para carregar o vetor texto. Para a palavra socorram-me, que possui 11 caracteres, a sada seria em-marrocos. Outra observac ao importante, e que como o scanf l e TODOS os caracteres que vem do teclado (inclusive o enter), e necess ario colocar um espaco (branco) antes do %c do scanf , para que sejam eliminados os possveis separadores (branco, tabs, 3 enters, etc). Caso contr ario, o enter dado ap os a leitura do tamanho da palavra se torna parte dos caracteres lidos, e portanto faria parte da palavra (h a muitos detalhes do C que precisam ser considerados quando se l e caracteres um a um). Experimente rodar esse programa usando esse mesmo exemplo, mas sem o espaco antes do %c no scanf . 4.3 Leitura de strings usando scanf Em exemplos anteriores, os strings foram carregados como constantes, e o compilador sabe quando o string comeca e termina devido ` as aspas. A leitura de strings usando scanf exige um pouco mais de cuidado, pois e necess ario saber como o scanf separa a entrada a partir do teclado em strings . Por convenc ao, os strings s ao delimitados por caracteres separadores, como o branco, tabulac ao, enter, etc (mas n ao de pontuac ao, como vrgula, dois pontos, ou ponto nal). Por exemplo, no programa abaixo: #include <stdio.h> #include <stdlib.h> #define MAX 100 int main () { int i,n; char frase[MAX]; printf("Digite o numero de palavras: "); scanf ("%d", &n); printf("Digite todas as palavras e ao final tecle ENTER:\n"); for (i=0; i<n; i++) { scanf("%s", frase); printf(":%s:\n", frase); } system("pause"); return 0; } para a entrada 3 (como n umero de palavras) e as palavras um, dois, tres., imprimir a na sada o seguinte: :um,: :dois,: :tres.: Uma nova vers ao para o programa que l e uma palavra e a imprime em ordem inversa usando strings e dada a seguir: #include <stdio.h> #include <stdlib.h> #define MAX 100 int main () { int i,n; char pal[MAX], inv[MAX]; printf("Digite sua palavra:\n"); scanf("%s", pal ); 4 / * acha fim do string em pal * / for (n=0; pal[n] != \0; n++); / * monta um string inverso * / for (i=0; i<n; i++) inv[i] = pal[n-1-i]; inv[n] = \0; / * coloca o terminador no string inv * / / * imprime o string em na ordem inversa * / printf("O seu texto na ordem inversa: \n"); printf("%s\n", inv); system ( "pause" ); return 0; } Vamos simular esse ultimo programa com a frase socorram-me. Ap os a declarac ao, os vetores pal e inv possuem conte udo incerto (ou seja, est ao vazios), como mostra a gura abaixo: pos: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 frase: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? inv: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Ap os o scanf , o vetor pal e carregado com socorram-me, e o string e automaticamente terminado por \0, como mostra a gura abaixo: pos: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 frase: s o c o r r a m - m e \0 ? ? ? inv: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O for ap os o scanf procura pela terminac ao do string , ou seja, procura pelo caractere \0, e o encontra na posic ao 11 do vetor, ou seja, n = 11, quando termina o for . A seguir, os caracteres de 10 a 0 s ao copiados do vetor pal para as posic oes 0 a 10 do vetor inv (ou seja, quando i = 0 por exemplo, inv[0] recebe o elemento n 1 i = 11 1 0 = 10 do vetor pal, ou inv[0] = frase[10]). Ao nal do for , o caractere \0 e colocado ao nal do string em inv para termin a-lo, de forma que teramos a seguinte situac ao: pos: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 frase: s o c o r r a m - m e \0 ? ? ? inv: e m - m a r r o c o s \0 ? ? ? e o ultimo printf apenas imprime o string em inv. 5 Exerccios recomendados - Exerccio 6.6 do caderno: Dados dois strings (um contendo uma frase e outro contendo uma palavra), determine o n umero de vezes que a palavra ocorre na frase. Exemplo: Para a palavra ANA e a frase: ANA E MARIANA GOSTAM DE BANANA --- --- --- --- temos que a palavra ocorre 4 vezes na frase. - Exerccio 8.17 (usa vetores de caracteres e n ao strings ). 5