Você está na página 1de 5

Departamento de Ci encia 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 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

Você também pode gostar