Você está na página 1de 11

Dulce Mota ISEP 63

Cadeias de caracteres (strings), Funes de Entrada/Sada e


Funes padro de tratamento de texto


Cadeias de caracteres - Representao de strings

Na linguagem C, no existe um tipo de dados primitivo para strings (ou cadeias de
caracteres). Para guardar uma string em memria necessrio recorrer a vectores.
Uma string no mais do que um vector de caracteres. O ltimo elemento
do vector tem de ser um marcador especfico que marque o fim da string. O marcador
universalmente utilizado, o carcter nmero 0 (zero) da tabela ASCII
1
o qual se
representa por \0. Este carcter no possui nenhuma representao grfica. No
confundir \0 cujo cdigo ASCII 0 (zero) com o carcter 0 cujo cdigo ASCII 48.
Exemplos de strings: Mrio Andr
Supermercado Tem Tudo
A.
Tambm, no confundir A com A. No primeiro caso, trata-se de uma string
enquanto que no segundo trata-se s do carcter A.
Uma string um vector de caracteres mas o inverso pode no ser verdade. Se o
vector de caracteres no terminar com o carcter \0 ento no uma string sendo
simplesmente um vector de caracteres.
Representao da string Maria:

M a r i a \0
v[0] v[1] v[2] v[3] v[4] v[5]

Apesar desta string ter cinco caracteres teis necessrio reservar espao em
memria para, pelo menos, seis caracteres. As posies excedentes ficam reservadas
apesar de no serem usadas.

1
ASCII (American Standard Code for Information Interchange) um conjunto de cdigos para
o computador representar nmeros, letras, pontuao e outros caracteres. Em C, trabalhar com
caracteres ou com o seu cdigo ASCII exactamente o mesmo.

Dulce Mota ISEP 64
Programao
em C
A biblioteca <string.h> disponibiliza um conjunto vasto de funes para
manipulao de strings, por exemplo comparar strings, concatenar strings, determinar
o comprimento de uma string.

Declarao de um vector de caracteres (strings) em C


A declarao de uma string obedece seguinte sintaxe:

char nome_s[Tamanho];

Tamanho: deve incluir o nmero de caracteres para guardar a string incluindo o
carcter \0.
Exemplo: char apelido[20]; /* espao para 19 caracteres teis */

Inicializao automtica de Strings

A inicializao automtica ou directa de strings possvel em C e deve ser realizada
no momento da declarao das mesmas, tal como mostrado nos seguintes exemplos:
char bebida[10]=vinho;
char bebida[10]={v,i,n,h,o};
char bebida[ ]=vinho;
char *bebida=vinho;
Em qualquer dos casos, o compilador coloca automaticamente o terminador \0. Na
primeira e segunda declaraes, o compilador atribui o carcter \0 a cada posio que
no foi inicializada nos vectores.


Dulce Mota ISEP 65
Programao
em C
Funes padro de entrada/sada de dados

As funes de entrada e sada da linguagem C encontram-se disponveis na
biblioteca de rotinas standard <stdio.h>. Estas funes podem ser divididas nas
seguintes classes:

E/S Formatada
E/S Carcter/String
E/S Bloco

No primeiro grupo englobam-se as funes: printf() e scanf().
Ao segundo grupo pertencem um conjunto de funes para leitura/escrita de
caracteres e strings as quais no incluem formatao especfica.
No ltimo grupo esto as funes que permitem o acesso directo a dados
guardados em memria permanente, funes essas, utilizadas para manipulao de
ficheiros. Este assunto ser retomado na seco de ficheiros de texto.

Funes de entrada e sada formatada

Entrada formatada


Uma funo deste grupo particularmente usada a funo: scanf().
Esta funo l qualquer tipo de dados, no sendo no entanto utilizada para leitura
de cadeias de caracteres (strings) que envolvam mais do que uma palavra. Para isso,
devem ser utilizadas outras funes.
Sintaxe da funo scanf():

int scanf(s_formato,arg1,arg2,...)
O primeiro argumento representa uma string, a qual contm os formatos
respeitantes ao tipo ou tipos de dados a ler. Estes devem corresponder, tanto em tipo
como em nmero, s variveis existentes nos restantes argumentos da funo.

Dulce Mota ISEP 66
Programao
em C
O valor inteiro de retorno da funo indica a quantidade de campos lidos.
Como referido anteriormente, os tipos de formatao utilizados em C
(%d,%f,%c,%s,%u, entre outros) existentes na string de formatao devem
estabelecer uma relao correcta com as variveis previamente definidas. Nesta string
s permitido escrever caracteres indicadores de formatos. Por exemplo, caracteres
como \n ou \t no devem ser includos.
No esquecer, que as variveis necessitam de ser precedidas do smbolo &, excepto
para leitura de strings (o nome do vector um apontador para o primeiro elemento do
vector) com o objectivo dos valores lidos serem de imediato colocados nos endereos
das variveis originais (passagem por cpia de referncia).
Um dos problemas da funo scanf() diz respeito sua utilizao em chamadas
consecutivas. O programa seguinte pretende ilustrar esta situao.













O objectivo deste programa fazer a leitura de dois caracteres e, em seguida,
mostr-los para o ecr. No entanto, s o primeiro carcter lido. Porqu?
Este problema tem a seguinte explicao: a grande maioria das funes de leitura
de dados executa esta operao encaminhando os dados lidos para o buffer do
teclado. Depois da introduo do primeiro carcter, necessrio carregar na tecla
<Enter>. Assim, em vez de um, feita a leitura de dois caracteres, o que vai provocar
que o primeiro carcter lido seja guardado em ch1 e o segundo carcter em ch2.
Deste modo, a segunda instruo de leitura do programa no ir ler o segundo
#include <stdio.h>

int main()
{
char ch1, ch2;
printf(Introduza um carcter: );
scanf(%c,&ch1);
printf(Introduza outro carcter: );
scanf(%c,&ch2);
printf(Caracteres lidos %c e %c\n,ch1,ch2);
return 0;
}

Dulce Mota ISEP 67
Programao
em C
carcter que o utilizador pretendia, porque o carcter <Enter>, existente no buffer,
j foi colocado em ch2.
Para resolver este problema, podemos colocar, dentro da string de formatao, um
espao em branco imediatamente antes do %c no segundo scanf().
Existe outra forma de resolver o mesmo problema utilizando a funo fflush(stdin)
entre chamadas funo scanf(). A funo fflush(stdin) limpa todos os caracteres
que existem no buffer do teclado (perifrico standard de input, stdin).

Sada formatada

Para mostrar informao, a funo mais utilizada em C a funo printf(). Esta
funo constri e mostra uma string formatada para o ecr.
A sua sintaxe a seguinte:
int printf(s_formato, arg1,arg2,...)
Ao contrrio da funo de leitura scanf(), a string de formatao, existente no
primeiro argumento pode conter qualquer carcter.
Nos restantes argumentos da funo, pode existir qualquer expresso vlida em C,
isto , variveis, constantes, expresses aritmticas, invocao de outras funes, etc.
Os caracteres de formatao em s_formato tambm devem corresponder em
nmero e tipo (neste ltimo caso, se no houver correspondncia no implica partida
problemas) em relao aos restantes argumentos da funo printf(). Os formatos dos
valores so iguais aos utilizados pela funo scanf(). possvel, tambm, incluir na
string de sada, mais alguns smbolos para mostrar os dados de um modo mais
profissional.
Por exemplo, a instruo:
printf(Ordenado mensal: %.2f\n,ordenado);
apresenta o ordenado (tipo float) com duas casas decimais (caracteres .2). Antes do
carcter ponto (.) tambm pode ser colocado um valor inteiro, permitindo assim

Dulce Mota ISEP 68
Programao
em C
reservar um conjunto de espaos, no perifrico de sada, para o valor (parte inteira e
parte decimal) que vai ser exibido.
Na instruo:
printf(Ms %2d\n,ms);
os caracteres %2d reservam dois dgitos para representar o ms,
independentemente do contedo da varivel ms ter um ou dois algarismos.
O carcter - indica que a sada justificada esquerda enquanto que o simbolo +
informa o compilador que os valores numricos devem ser apresentados com sinal.

Funes de entrada e sada no formatada

Leitura e escrita de strings

As funes scanf() e printf() so utilizadas normalmente para a leitura e escrita
de strings (formatao %s). No entanto, a funo scanf() no pode ler strings que
contenham: espaos, caracteres do tipo \t, entre outros. Tudo o que for digitado a
seguir a estes caracteres, no colocado nas variveis. Para resolver esta situao,
deve ser usada a funo gets().

Funo gets() (get string)
Esta funo coloca na varivel, existente no argumento, todos os caracteres
introduzidos, via teclado, incluindo caracteres do tipo: <espao>,<tab> e <enter>.
Exemplo:








#include<stdio.h>

int main()
{
char morada[35];
printf(Introduza a sua morada: );
gets(morada);
printf(\nMorada: %s,morada);
return 0;
}

Dulce Mota ISEP 69
Programao
em C
Funo puts() (put string)
Esta funo permite escrever uma string no ecr. Esta string passada para a
funo atravs do seu nico parmetro. A mudana de linha feita automaticamente.
puts(Sou uma string) equivalente a:
printf(Sou uma string\n);

Funes: getchar() e putchar()
Estas funes so utilizadas para ler e escrever, respectivamente, um s carcter. A
primeira funo, til, por exemplo, quando o programa necessita de ler carcter a
carcter e ao mesmo tempo proceder a certas validaes, por exemplo, no deixar
introduzir alguns caracteres via teclado, por exemplo: w, y. Deste modo, quando for
detectado um carcter invlido, o programa no o guarda, passando para a prxima
instruo.
Exemplos de utilizao destas funes:























#include <stdio.h>

int main()
{
char ch;
printf(Introduza um carcter );
ch=getchar();
printf(Carcter introduzido %c,ch);
return 0;
}

#include <stdio.h>

int main()
{
char c=*;
for(int i=0;i<10;i++)
putchar(c);
putchar(\n);
return 0;
}


Dulce Mota ISEP 70
Programao
em C
Passagem de strings para funes

Dado que strings so representadas como vectores de caracteres, a passagem de
strings para funes realizada da mesma forma que a passagem de vectores de
outro tipo qualquer de elementos.
Caso prtico 1.

















Caso prtico 2.


















#include <stdio.h>
#define TAM 80

int strY(char s1[]) //o mesmo que: int strX(char *s1)
{
int i=0;
while(s1[i] !='\0')
i++;
return i;
}
int main()
{
char str1[TAM];
int x;
puts("Digite uma string:");
gets(str1);
x=strY(str1);
printf("\n %d",x);
system("pause");
return 0;
}
#include <stdio.h>
#define TAM 80

int strX(char *s1, char *s2)
{
int i=0;
while(s1[i]==s2[i] && s1[i] !=\0)
i++;
return (s1[i]-s2[i]);
}
int main()
{
char str1[TAM], str2[TAM];
int x;
puts(Escreva o nome completo:);
gets(str1);
puts(Escreva outro nome completo:);
gets(str2);
x=strX(str1,str2);
printf(\n%d,x);
return 0;
}

Dulce Mota ISEP 71
Programao
em C
Principais funes de manipulap de strings


A linguagem C dispe de um conjunto muito vasto de funes standard para
manipulao de strings. Na tabela abaixo, encontram-se descritas as funes mais
utilizadas. Na biblioteca <string.h> pode encontrar muitas outras funes.


Assinatura Descrio
int strlen(char *s) Devolve o comprimento de uma string.
char * strcpy(char *dest, char *orig) Copia uma string para outra.
char * strcat(char *dest, char *orig) Concatena strings.
int strcmp(char *s1, char *s2) Compara alfabeticamente strings
int stricmp(char *s1, char *s2) Compara strings com ignore case
char *strchr(char *s1, char chr) Procura o carcter chr na string s1
char *strstr(char *s1, char *s2) Procura a string s2 na string s1

Caso prtico 1.





















Este programa l duas strings para os vectores nome e apelido, respectivamente, e
constri uma nova string com o seguinte formato: nome, apelido.
#include <stdio.h>
#include <string.h>

#define TAM 80
#define SEP ", "

int main()
{
char nome[TAM], apelido[TAM], completo[2*TAM];

printf("\nNome:");
gets(nome);
if (strlen(nome)!=0)
{
printf("\nApelido:");
gets(apelido);
strcpy(completo, apelido);
strcat(completo, SEP);
strcat(completo, nome);
puts(completo);
}
else printf("\n Nome vazio");
system("pause");
return 0;
}

Dulce Mota ISEP 72
Programao
em C
Passagem de parmetros na linha de comando

A funo main() pode receber informao que passada na linha de comando,
atravs de dois parmetros:
int main(int argc, char *argv[])
argc- um valor inteiro que indica a quantidade de argumentos que foram
passados na linha de comando (inclui o prprio nome do programa).
argv- um vector contendo todas as strings passadas na linha de comando, por
isso, declarado com [], que significa vector, acrescentando-se declarao char *,
que significa string. Portanto, argv um vector de strings (char *argv[]). A
primeira string sempre o nome do programa.
Por exemplo, se for escrita a seguinte informao, na linha de comando:
c:\>teste BB 123 C2
significa:
teste nome do programa (1 argumento)
BB 2 argumento
123 3 argumento
C2 4 argumento
possui a seguinte representao:
argv






argv[0]

c o n c a t e n a \0
argv[1]

B B \0
argv[2]

1 2 3 \0
argv[3]

C 2 \0
argv[4]

NULL

Dulce Mota ISEP 73
Programao
em C
O valor NULL colocado automaticamente indicando que as strings do vector j
terminaram.
O objectivo de passar informao para um programa, atravs da linha de
comandos, semelhante aos programas da classe dos utilitrios pertencentes aos
sistemas operativos. Por exemplo, em MS-DOS, o comando:
c:\>rename ficX ficY
executa o programa rename o qual altera o nome do ficheiro ficX para ficY. Estes
dois ltimos nomes constituem os argumentos do programa.
Para finalizar, o programa abaixo, executa a soma de valores passados pela linha de
comando.














Nota: A funo atoi() (ascii to int) recebe uma string e devolve o inteiro que nela
est representado.
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
int i, soma=0;

for(i=1;i<argc;i++)
soma += atoi(argv[i]);
printf("\n Soma = %d",soma);
system("pause");
return;
}

Você também pode gostar