Introdução aos caracteres e processamento de cadeias.! caracteres são blocos fundamentais de programas em C++.! Programa: composto de seqüência de caracteres que quando agrupadas tem um significado, ou seja, são interpretados como uma série de instruções usadas para realizar uma tarefa.! caractere constante: valor inteiro representado como um caractere entre. Por exemplo, z representa o inteiro correspondente ao z, \n representa o inteiro correspondente ao newline.! Uma string é uma série de caracteres tratados como uma única unidade. Pode conter: letras, dígitos e caracteres especiais como +,-,*,/,$ e outros.! string literal ou string constante são escritas com aspas duplas.! Programação de Computadores! Turma C, segundo semestre de 2001 Programação de Computadores 171
! Uma string em C++ é um arranjo de caracteres que termina com \0 e é acessado via ponteiro. O valor de uma string é o endereço de seu 1º caractere.! Uma string é um ponteiro ( um ponteiro para o primeiro caractere)! Strings são como arranjos, um arranjo também é um ponteiro para seu 1º elemento char cor[ ]= azul ; // cria um arranjo com 5 posições char *pontcor= azul ; // cria um ponteiro chamado de pontcor que aponta para uma posição de memória que armazena a string azul Programação de Computadores 172
Exemplos: char palavra[20]; cin>>palavra; // lê os caracteres e atribui a palavra até encontrar um espaço, um caractere de tabulação, um newline ou indicador de fim de arquivo. Note que o número de caracteres não deve ser maior que 19 para deixarmos espaço para o \0. cin>>setw(19)>>palavra ;// garante os 19 Programação de Computadores 173
! Entrada de uma linha de texto: função cin.getline que tem 3 argumentos, o arranjo de caracteres onde o texto será armazenado, o tamanho e um caractere delimitador. Exemplo: char sentenca[80]; cin.getline(sentenca, 80, \n ); // lê os caracteres entrados pelo teclado e os coloca no arranjo sentenca. A leitura termina quando encontrar um \n, um fim-de-arquivo ou atingir 79.! Terceiro argumento é padrão, portanto, podemos escrever: cin.getline(sentenca,80); Programação de Computadores 174
! Alguns compiladores(borland) tem problemas quando misturamos cin.get( ) com cin>>. Por exemplo, o código abaixo costuma dar problemas: #include <iostream.h> void main( ) { char str[80]; int idade; cout<<"entre com a idade:"; cin>>idade; cout<<"entre com o nome:"; cin.get(str,80); cout<<"empregado:"<<str<<" idade="<<idade; Entre com a idade:32 Entre com o nome:empregado: idade=32 Programação de Computadores 175
#include <iostream.h> void main( ) { char str[80]; int idade; cout<<"entre com a idade:"; cin>>idade; cin.ignore(10,'\n'); // para consertar o problema cout<<"entre com o nome:"; cin.get(str,80); cout<<"empregado:"<<str<<" idade="<<idade; Entre com a idade:32 Entre com o nome:mario Sérgio da Silva Empregado:Mario Sérgio da Silva idade=32 Programação de Computadores 176
! Biblioteca string.h contem as funções usadas para manipulação de strings. Exemplos:! char * strcpy(char *s1, char *s2) => copia s2 em s1 e retorna s1;! char* strncpy(char *s1,char *s2, size_t n) =>copia no máximo n caracteres de s2 em s1 e retorna s1. (size_t é um tipo integral sem sinal definido em stdef.h)! char* strcat(char *s1, const char *s2) => coloca s2 no final de s1 e retorna s1.! char* strncat(char *s1, char *s2, size_t n) => coloca no máximo n caracteres de s2 no final de s1 e retorna s1! int strcmp(const cahr *s1, const char *s2) => compara s1 com s2 e retorna 0 se s1=s2, <0 se s1<s2 e >0 se s1>s2! int strcmp(const cahr *s1, const char *s2, size_t n) => compara até n caracteres de s1 com s2 e retorna 0 se s1=s2, <0 se s1<s2 e >0 se s1>s2 Programação de Computadores 177
// exemplo de uso de strcpy e strncpy #include <iostream.h> #include <string.h> void main( ) { char X[ ]= Happy birthday to you ; char Y[25],Z[15]; cout<< A cadeia no arranjo X é: <<X<<endl<< A cadeia no arranjo Y é; <<strcpy(y,x)<<endl; strncpy(z,x,14); z[14]= \0 ; cout<< A cadeia no arranjo z é: <<Z<<endl; A cadeia no arranjo X é: Happy birthday to you A cadeia no arranjo Y é: Happy birthday to you A cadeia no arranjo Z é: Happy birthday Programação de Computadores 178
// uso de strcat e strncat #include <iostream.h> #include <string.h> void main( ) { char s1[20]= happy ; char s2[ ]= new year ; char s3[ ]= ; cout<< s1= <<s1<<endl<< s2= <<s2<<endl; cout<< strcat(s1,s2)= <<strcat(s1,s2)<<endl << strncat(s3,s1,6)= <<strncat(s3,s1,6)<<endl; cout<< strcat(s3,s1)= <<strcat(s3,s1)<<endl; s1= happy s2= new year strcat(s1,s2)= happy new year strncat(s3,s1,6)= happy strcat(s3,s1)= happy happy new year Programação de Computadores 179
//usando strcmp e strncmp s1= happy new year #include <iostream.h> s2= happy new year #include <iomanip.h> s3= happy holidays #include <string.h> strcmp(s1,s2)= 0 strcmp(s1,s3)= 6 void main( ) strcmp(s3,s1)= -6 { char *s1= happy new year ; strncmp(s1,s3,6)= 0 char *s2= happy new year ; strncmp(s1,s3,7)= 6 char *s3= happy holidays ; strncmp(s3,s1,7)= -6 cout<< s1= <<s1<<endl<< s2= <<s2<<endl<< s3= <s3<<endl<<endl; cout<< strcmp(s1,s2)= <<setw(2)<<strcmp(s1,s2)<<endl<< strcmp(s1,s3)= << setw(2)<<strcmp(s1,s3)<<endl<< strcmp(s3,s1)= << setw(2) << strcmp(s3,s1)<<endl; cout<< strncmp(s1,s3,6)= <<setw(2)<<strncmp(s1,s3,6)<<endl<< strncmp(s1,s3,7)= <<setw(2)<<strncmp(s1,s3,7)<<endl<< strncmp(s3,s1,7)= <<setw(2) <<strncmp(s3,s1,7)<<endl; Programação de Computadores 180
! char * strtok(char *s1, const char *s2) => uma sequência de chamadas de strtok quebra a string s1 em tokens (sequência de caracteres separados por um delimitador de caracteres, que normalmente é um espaço ou caracteres de pontuação)- partes lógicas como palavras em texto separadas pelo caracteres contidos em s2.! 1ª chamada contem 2 argumentos: a string a ser tokenizada e a string que contem os caracteres que separam os tokens (delimitadores) Programação de Computadores 181
// usando strtoken #include <iostream.h> #include <string.h> void main( ) { char cadeia[ ]="Essa é uma cadeia com sete tokens"; char *pontoken; cout<<"a cadeia original é: "<<cadeia<<endl; cout<<"os tokens da cadeia original são:"<<endl; pontoken=strtok(cadeia," "); while (pontoken!= NULL) { cout<<pontoken<<endl; pontoken=strtok(null," "); Programação de Computadores 182
! pontoken= strtok(cadeia, );! 1ª chamada, primeiro argumento é a cadeia a ser quebrada! segundo argumento (" ") indica que os tokens são separados por espaço! atribui ao ponteiro o endereço do primeiro token da cadeia! percorre a cadeia até achar o separador e troca por '\0' terminado o 1º token! a função strtok salva o ponteiro para o próximo caractere da cadeia e retorna o ponteiro para o próximo token! pontoken = strtok(null, );! as chamadas agora tem NULL como primeiro argumento indicando que strtok deve continuar a partir da posição que foi salva na chamada anterior de strtok! Se não tiver havido nenhuma chamada de strtok, a função retorna NULL Programação de Computadores 183
Programação de Computadores 184! size_t strlen(const char *s) => determina o tamanho da string s,ou seja, o número de caracteres que precede o \0. //usando strlen #include <iostream.h> #include <string.h> void main( ) { char *cadeia1= Campinas ; char *cadeia2= Ana ; cout<< cadeia1= <<cadeia1<<, tamanho= << strlen(cadeia1)<<endl<< cadeia2= << cadeia2<<,tamanho= <<strlen(cadeia2)<< endl; cadeia1=campinas,tamanho=8 cadeia2=ana,tamanho=3