Sie sind auf Seite 1von 5

o Departamento de Ci encia da Computac a

IME/USP

o a Computac o MAC2166 Introduc a a


Strings e vetores de caracteres

Resumo:

o de palavras e textos. Strings s O uso de strings facilita a manipulac a ao basicamente vetores do tipo char , por em diferentemente de simples vetores, strings s ao terminadospor um caractere \0. Utilize es scanf e printf . Voc %s para ler e imprimir strings nas func o e pode utilizar strings constantes o. Uma constante do tipo string e denida por uma para carregar vetores de caracteres na sua declarac a ncia de caracteres entre aspas (lembre-se que uma constante do tipo char e um caractere entre ap seq ue ostrofes).

o: Descric a

o vamos estudar como palavras (seq ncias de caracteres) s Nessa lic a ue 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); ncia de caracteres: "); prinft("Digite a seq ue for ( i=0 ; i<n ; i++ ) scanf("%c", &vet[i]); prinft("A palavra que voc e 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 bastante simples. atividade que, a princ pio, e 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

o provavelmente n por um ponto. Obviamente, nenhuma pessoa poderia ter um . em seu nome, e essa soluc a ao o. seria apropriada para entrar frases, ou textos com pontuac a Strings s ao vetores de caracteres terminados por um caractere especial, o \0 (barra zero). Esse caractere indica normalmente tratado pelo pr o de o nal da palavra ou texto e e oprio computador, facilitando assim a manipulac a palavras.

Entrada e sa da

ncia %s para ler (usando scanf ) e imprimir (usando printf ) strings . Em C utiliza-se a seq ue

Exemplos

ncia de caracteres entre aspas, como mostra Na linguagem C, podemos inicializar strings colocando a seq ue o exemplo abaixo (tente descobrir a sa da desse programa antes de continuar): #include <stdio.h> #include <stdlib.h> #define MAX 100 int main () { /* Declarac oes */ 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

o do programa Descric a

O vetor texto de caracteres, quando carregado, recebe automaticamente pelo compilador um caractere \0, es com ? n desconhecido): como mostrado abaixo (as posic o ao foram inicializadas, ou seja, seu conte udo e texto: a p e n a s u m e x e m p l o . \0 ? ? o: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 posic a O primeiro printf imprime o string apenas um exemplo., ou seja, percorre o vetor texto e imprime os seus caracteres um a um, at e encontrar um caractere \0. Um trecho 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 :

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 . o (\0), n Al em do c odigo de terminac a ao h a diferenc a entre strings e vetores de caracteres, ou seja, strings podem ser considerados vetores de caracteres terminados por um caractere \0, como ilustrado pelo es 0 a 4 do vetor texto os caracteres i, j, k, l, m), ou primeiro for do programa, que coloca nas posic o seja, o vetor texto caria assim: texto: i j k l m s u m e x e m p l o . \0 ? ? o: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 posic a ltimo printf seria ijklms um exemplo.. e o string impresso pelo u : quando dizemos que o string e terminado por um \0, signica que a parte v OBSERVAC AO alida dos es ap dados est a antes desse caractere especial. As posic o os o \0, permanecem vazias, e podem ser utilizadas utilizado, por exemplo, para armazenar um outro string de maior comprimento. quando o vetor e

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 realc ar 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 () { /* Declarac oes */ 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 o importante, a palavra socorram-me, que possui 11 caracteres, a sa da seria em-marrocos. Outra observac a que como o scanf l necess e e TODOS os caracteres que vem do teclado (inclusive o enter), e ario colocar um espac o (branco) antes do %c do scanf , para que sejam eliminados os poss veis separadores (branco, tabs,

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 espac o 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 ` s aspas. string comec a e termina devido a necess A leitura de strings usando scanf exige um pouco mais de cuidado, pois e ario saber como o scanf o, os strings s separa a entrada a partir do teclado em strings . Por convenc a ao delimitados por caracteres o, enter, etc (mas n o, como v separadores, como o branco, tabulac a ao de pontuac a rgula, 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 sa da o seguinte: :um,: :dois,: :tres.: dada Uma nova vers ao para o programa que l e uma palavra e a imprime em ordem inversa usando strings e 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 );

/* 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; } ltimo programa com a frase socorram-me. Ap o, os vetores pal e inv Vamos simular esse u os a declarac a 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: carregado com socorram-me, e o string e automaticamente terminado por \0, Ap os o scanf , o vetor pal e 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 do string , ou seja, procura pelo caractere \0, e o encontra O for ap os o scanf procura pela terminac a o 11 do vetor, ou seja, n = 11, quando termina o for . A seguir, os caracteres de 10 a 0 s na posic a ao copiados es 0 a 10 do vetor inv (ou seja, quando i = 0 por exemplo, inv[0] recebe o do vetor pal para as posic o elemento n 1 i = 11 1 0 = 10 do vetor pal, ou inv[0] = frase[10]). Ao nal do for , o colocado ao nal do string em inv para termin o: caractere \0 e a-lo, de forma que ter amos a seguinte situac a 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 ? ? ? ltimo printf apenas imprime o string em inv. eou

Exerc cios recomendados

- Exerc cio 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. - Exerc cio 8.17 (usa vetores de caracteres e n ao strings ).

Das könnte Ihnen auch gefallen