Você está na página 1de 5

Departamento de Cienciaˆ

da Computac¸ ao˜

IME/USP

MAC2166 Introduc¸ ao˜ a Computac¸ ao˜

Strings e vetores de caracteres

1 Resumo:

O uso de strings facilita a manipulac¸ ao˜ de palavras e textos. Strings sao˜ basicamente vetores do tipo char , porem´ diferentemente de simples vetores, strings sao˜ ”terminados”por 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´ definida por uma sequ¨ 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 (sequ¨ enciasˆ

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];

de caracteres) sao˜ tratadas no C.

printf("Digite o tamanho do vetor: "); scanf("%d", &n);

prinft("Digite a seq¨uˆencia de caracteres: "); 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 usuario´ precisando digitar seu nome para um formulario,´ e o computador pedindo para que ele, primeiramante, digite o numero´ de caracteres a serem lidos, como no exemplo acima. Isso complica muito uma atividade que, a princ´ıpio, 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 nao˜ seria apropriada para entrar frases, ou textos com pontuac¸ ao.˜

Strings sao˜

o final da palavra ou texto e e´ normalmente tratado pelo pr oprio´ palavras.

computador, facilitando assim a manipulac¸ ao˜ de

vetores de caracteres terminados por um caractere especial, o ’ \0’ (barra zero). Esse caractere indica

3 Entrada e sa´ıda

Em C utiliza-se a sequ¨ enciaˆ

’%s’ para ler (usando scanf ) e imprimir (usando printf ) strings .

4 Exemplos

Na linguagem C, podemos inicializar strings colocando a sequ¨ enciaˆ

o exemplo abaixo (tente descobrir a sa´ıda desse programa antes de continuar):

de caracteres entre aspas, como mostra

#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 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 ’?’ nao˜ foram inicializadas, ou seja, seu conteudo´ 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 um a um, ate´ encontrar um caractere ’ \ 0’. Um trecho de c odigo´ texto) seria:

equivalente a printf("%s\ n",

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 numero´ de caracteres a serem impressos, e que o uso de ”%s”simplifica bastante a impressao˜ de strings . Alem´ do codigo´ de terminac¸ ao˜ (’\ 0’), n ao˜ ha´ 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 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 ficaria assim:

texto:

i

k

j l

m

s

 

u

m

 

e

x

e

m

p

l

o

.

\

0

?

?

posic¸ ao:˜

0

2

1 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’, significa que a parte valida´

dados esta´ antes desse caractere especial. As posic¸ oes˜ apos´ o ’\0’, permanecem vazias, e podem ser utilizadas quando o vetor e´ utilizado, por exemplo, para armazenar um outro string de maior comprimento.

dos

4.2 Um outro exemplo

Vamos ver agora um programa que leˆ uma palavra e imprime os caracteres na ordem inversa a de leitura sem o uso de strings , apenas para realc¸ar a dificuldade de tratar palavras quando os caracteres sao˜ 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 numero´ de caracteres a serem lidos, para carregar o vetor texto . Para

a palavra ”socorram-me”, que possui 11 caracteres, a sa´ıda seria ”em-marrocos”. Outra observac¸ ao˜ importante,

e´ que como o scanf leˆ TODOS os caracteres que vem do teclado (inclusive o enter), e´ necess ario´ colocar um espac¸o (branco) antes do %c do scanf , para que sejam eliminados os poss´ıveis 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 leˆ 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 string comec¸a e termina devido as` aspas. A leitura de strings usando scanf exige um pouco mais de cuidado, pois e´ necessario´ saber como o scanf separa a entrada a partir do teclado em strings . Por convenc¸ ao,˜ os strings sao˜ delimitados por caracteres separadores, como o branco, tabulac¸ ao,˜ enter, etc (mas n ao˜ de pontuac¸ ao,˜ como v´ırgula, dois pontos, ou ponto final). 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 numero´

:um,:

:dois,:

:tres.:

de palavras) e as palavras ”um, dois, tres.”, imprimira´ na sa´ıda o seguinte:

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 conteudo´ incerto (ou seja, estao˜ vazios), como mostra a figura abaixo:

pos:

0

1

3

4 5

2 6

 

7 8

 

9

11

10 13

12 14

frase:

?

?

?

? ?

? ?

 

? ?

?

?

? ?

? ?

inv:

?

?

?

? ?

? ?

 

? ?

?

?

? ?

? ?

Apos´ o scanf , o vetor pal e´ carregado com ”socorram-me”, e o string e´ automaticamente terminado por ’ \ 0’, como mostra a figura abaixo:

pos:

0

1

2

3

4

5

6

7

8

9

10

11

13

12 14

frase:

s

o

c

o

r

r

a

m

-

m

e

\

0

?

? ?

inv:

?

?

?

?

?

?

?

?

?

?

?

?

?

? ?

O

for apos´ 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 sao˜ 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 final do for ,

caractere ’\0’ e´ colocado ao final do string em inv para termina-lo,´

o

de forma que ter´ıamos a seguinte situac¸ ao:˜

pos:

0

1

2

3

4

5

6

7

8

9

10

11

13

12 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 Exerc´ıcios recomendados

-

Exerc´ıcio 6.6 do caderno: Dados dois strings (um contendo uma frase e outro contendo uma palavra), determine

o

numero´

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 nao˜ strings ).

5