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