Você está na página 1de 25

Alexandre Mota

acm@cin.ufpe.br

Na

linguagem de programao C, uma


frase (ou string) no um tipo de dado
especfico
Faz-se simplesmente o reuso do tipo de
dado bsico char
Assim, uma string de tamanho 10
declarado como:
char nome[10];

Tal

qual um vetor tradicional, uma string


pode ser inicializada na declarao
Da seguinte forma:
char nome[10] = Joao;
Note

que como um vetor tambm


poderia ser inicializado assim:
char nome[10] = { J, o, a, o, \0};

Aparece

um curioso caracter \0 no final.


Ele marca o final da string

Strings

usam aspas e apstrofos so para


caracteres individuais
A string Joao (4 caracteres visveis) na
verdade correspondem seqncia
{ J, o, a, o, \0 }
O caracter \0 que marca o final da string
ocupa uma posio
Assim, para a declarao char nome[10],
na verdade temos no mximo 9
caracteres teis a usar

Este

caracter especial usado para


demarcar o final da string
E permitir que tamanhos variveis possam
ser usados sem usurio se preocupar em
controlar isto
Casos extremos (para char nome[10]):
Um nome vazio seria nome[0] = \0;
Um nome cheio seria nome = abcdefghi;

comando bsico para isto o scanf


Supondo que temos uma string chamada
nome
Infelizmente este comando,
O comando
com estes parmetros, s l
scanf(%s, nome);

strings sem espaos internos!

Carrega

o que for digitado pelo teclado


nesta varivel
Note que a varivel no tem o & como
prefixo. Isto ser explicado posteriormente

Para

ler strings com espaos internos,


precisamos usar esta nova configurao

scanf( %[^\n], nome);


Mas esta configurao ainda tem
Oum
espao
antesOde
% instrui
C a descartar
problema.
caracter
\n no
espaos
antes
da do
primeira
palavra
pode surgir
alm
que a string
(Violao
de memria)!
Acomporta
seqncia
de controle
^\n instrui C a

ler toda a seqncia de caracteres at


encontrar um \n (<ENTER>)

Faa

um programa em C que leia seu


primeiro e ltimo nomes, bem como seu
sexo (como char M ou F), e mostre na
tela o seguinte:

Sr. ltimo, Primeiro

(se for Masculino)


Sra. ltimo, Primeiro (se for Feminino)
Obs.: Com char usa-se e como vetor de chars (strings), usa-se

Precisamos

garantir que a string lida


caber na varivel, sem violar limites de
memria
Ento, supondo a declarao
char nome[21];
Usamos

a seguinte configurao

scanf( %20[^\n], nome);


Note

o 20 vs 21 entre declarao e scanf.


Por que isto ocorre?

funo gets bem mais simples que a


funo scanf
Para ler string nome, basta
gets(nome);
A

sua nica desvantagem que no limita


o tamanho de uma string lida
Pode violar memria e causar mal
funcionamento do programa

Como

strings so vetores, h comandos


especiais para lidar com elas
Por exemplo, no se pode atribuir uma
string diretamente exceto na inicializao
char nome[10];
nome = Alex; // Est incorreto!!!

preciso usar uma biblioteca chamada


string.h, onde h vrias funes prdefinidas

simples comando de atribuio

nome = Alex;
O

qual est incorreto, deve ser


substitudo pela funo (correto)
strcpy(nome, Alex);

funo strcpy (string copy) est definida


na biblioteca string.h, a qual se faz
necessria para compilar corretamente
tais programas

Por

trs da funo strcpy

strcpy(novo, antigo); // Equival. a novo = antigo


H

um programa bem simples


Este programa copia cada posio do
vetor (string) antigo para a posio
correspondente no vetor (string) novo
Algo como:
i = 0;
while(antigo[i]!=\0)
{ novo[i] = antigo[i]; i++ }

Note

pelo cdigo anterior que o


comando de atribuio no existe para
strings
Mas a funo strcpy definida em termos
do comando de atribuio entre
elementos de vetores
Caracter especial \0 serve de ponto de
parada, como j havamos dito
anteriormente

Do

mesmo modo que temos o comando


x = x + 2 para inteiros
Temos um correspondente para strings
a funo strcat (string catenation)
Uma chamada como
strcat(novo, antigo);

equivalente ao comando (incorreto para


strings)
novo = novo + antigo;

Faa

um programa que declara 2 strings,


uma de 30 caracteres e outra de 15
caracteres. Leia do teclado ambas as
strings mas com no mximo 14
caracteres cada. Concatene a string de 15
caracteres ao final da de 30 sem usar o
comando strcat. Apresenta a string
resultante.

Alm

de no termos atribuio, tambm


no podemos comparar strings como os
demais tipos
Por exemplo, enquanto podemos fazer
x == y, ou x < y
para

nmeros e at caracteres
Para strings, precisamos usar a funo
strcmp (string comparison)

chamada

strcmp(string1, string2)
retorna

um nmero inteiro
H 3 casos possveis:
0 significa que string1 e string2 so iguais
Negativo significa que string1 menor que
string2
Positivo significa que string1 maior que
string2

Tal

qual a funo strcpy definida, a


funo strcmp funciona nos elementos
internos dos vetores
Resultado da funo basicamente uma
operao aritmtica baseada na i-sima
posio dos vetores de caracteres
string1[i] string2[i]
Note

que expresso d 0 se caracteres


forem iguais, > 0 se e < 0 se

Faa

um programa que resulta no mesmo


comportamento da funo strcmp para
duas strings de tamanhos 20 e 15
respectivamente.

Apesar

da declarao definir um tamanho


para uma string
Vimos que o caracter \0 permite
tamanhos dinmicos
Baseada na posio do caracter \0, a
funo strlen resulta no tamanho (nm.
natural) dinmico da string
Seu uso :
strlen(nome);

Como

seria a implementao da funo


strlen? Faa um programa que exiba este
mesmo comportamento.

Faa

um programa que l uma string de


no mximo 10 caracteres e informa ao
usurio se ela um palndromo
Isto , se a palavra lida idntida a sua
verso invertida
Ex.: ama ou anilina ou arara

entrada de dados pelo teclado pode


ficar acumulada
Se isto ocorrer, o scanf pode no
funcionar corretamente (Pular a
entrada)
Se isto ocorrer, voc dever usar:
fflush(stdin) [Windows] ou __fpurge(stdin)
[Linux] ou rewind(stdin)
Antes

de cada scanf

Alexandre Mota
acm@cin.ufpe.br

Você também pode gostar