Baixe o app para aproveitar ainda mais
Prévia do material em texto
String: Cadeia de caracteres. S t r i n g s Conceitos Básicos A linguagem C não possui o tipo de dados primitivo string, diferentemente de outras linguagens de programação. Logo, como representar e manipular esse importante tipo de dado. Em C, uma string é representada por um array de caracteres, ou seja, um agregado homogêneo, em que o tipo base é um char. O último caractere de qualquer string em C é o caractere nulo (caractere de terminação) que é representado por ‘\0’. Isso possibilita que ao desenvolvermos nossas códigos possamos reconhecer o seu final, e consequentemente manipular esses objetos de forma mais consistente. O caractere nulo não é passível de ser impresso e possui valor ordinal 0 (zero) na Tabela ASCII. ´r´ ´a´ ´\0´´o´´E´ ´r´ ´d´ ´e´ ´r´´E´ ´n´ ´a´´d´´t´ S t r i n g s Conceitos Básicos ´r´ ´\0´´o´´E´ ´r´ ´a´ ´\0´´r´´E´ ´n´ ´a´´d´´t´ ´r´ ´a´ ´\0´´o´´P´ ´ã´´ç´´g´ ´m´ ´a´´r´ ´o´ ´a´ ´\0´´i´´M´ ´r´ ´i´´A´ ´é´´a´ ´a´´l´´m´ Exemplos: S t r i n g s Conceitos Básicos Como a linguagem C não possui o tipo de dados primitivo string, todas manipulações associadas a uma string só podem ser realizadas através de funções primitivas da biblioteca padrão <string.h> ou através de funções que você elaborar, jamais através de operadores de atribuição ou relacionais. Se s1 e s2 são variáveis do tipo string, as instruções abaixo são inválidas if (s1 == s2) ... if (s1 >= s2) ... Não existe em C operadores para manipular strings. Observações: Æ ‘a’ é diferente de “a”; Æ‘0’ é diferente de 0 (zero). Como converter um caractere numérico para o seu respectivo valor decimal? ‘a’ : caractere a; “a” : string “a”; a \0 s = s1 + s2 ; S t r i n g s Conceitos Básicos Embora a linguagem C não possua um tipo de dado primitivo (pré-definido) para manipular strings, ela admite constantes do tipo string (sempre entre aspas), declaradas através da diretiva de pré-processamento define. Nesse caso, o compilador automaticamente acrescenta o caractere nulo ao seu final. Só para lembrar: ... #define MSG1 “Erro de Entrada!!!” #define MSG2 “Introduza um valor inteiro: ” ... S t r i n g s Conceitos Básicos Æ Comparação entre strings; Operações sobre Strings Æ Pesquisa/localização/ocorrências de caracteres em strings; Æ Pesquisa/localização exata/aproximada de strings em strings; Æ Conversão de strings em dados numéricos; Æ Cópia e concatenação (merge) de strings; Æ Calcular o comprimento (número de caracteres) de strings; Æ Separação de strings; .... S t r i n g s Conceitos Básicos Æ Editores de texto em geral (correção ortográfica, verificação de ocorrência, reconhecimento de autoria, ...); Algumas Aplicações TRABALHO DE PROGRAMAÇÃO – ICC Operações sobre Conjuntos – Arrays Arrays (arranjos unidimensionais) podem ser utilizados para representar diferentes conjumtos de elementos. Logo, estas estruturas podem ser utilizadas de forma que possamos operar sobre estes objetos matemáticos. Este é exatamente o objetivo deste trabalho. Vamos considerar A e B como sendo conjuntos de numeros inteiros positivos ordenados com m e n elementos, respectivamente. Vamos adimitir ainda que ambos os conjuntos estejam armazenados numa estrutura de array. S t r i n g s Conceitos Básicos Algumas Aplicações Æ Busca/Localização de documentos em seu sistema Desktop/Internet, .... S t r i n g s Conceitos Básicos Algumas Aplicações ÆGenômica/ Biologia Computacional (identificação de padrões em DNA, alinhamentos de seqüências, ...); S t r i n g s Conceitos Básicos Texto: ACCCTGTTTAGATCACGGCACTACTGTAAAC Partes do padrão: TAAAT, CACGG, CATACT Padrão: TAAATCACGGCATACT S t r i n g s Conceitos Básicos ... #define MAX 100 char string1[MAX], string2[2*MAX]; //array de caracteres char *ptr_s1, *ptr_s2; Declaração de Strings e Ponteiros para tipo base char Lembre-se, o caractere ‘\0’ deve ser acrescentado em toda string, assim, se você desejar armazenar uma “cadeia de caracteres” de tamanho 50, então, a dimensão do array deve ser 51. Uma Boa Idéia!!! S t r i n g s Conceitos Básicos Leitura de Strings A função padrão de leitura formatada scanf(.), pode ser usada para leitura de strings, mas não é ideal, já que ela permite a leitura de vários itens separados por um caractere de tabulação, por um caractere de espaço, ou ainda pelo pressionar da tecla ENTER. Somente a primeira parte da string, representada por “Introdução” seria armazenada. Ver exemplo de código no próximo slide. Por exemplo, o que acontece se lermos a string “Introdução a Ciência da Computação” com a função scanf(.). S t r i n g s Conceitos Básicos ... char string[51]; ... printf(“Introduza uma < string >: ”); scanf(“%s”,string); printf(“String introduzida”,string); ... Uso de scanf(.) para leitura de Strings (Inadequado) S t r i n g s Conceitos Básicos Funções Específicas para leitura/Impressão de Strings Leitura: (<stdio.h>) char *gets(char *Str) // protótipo Essa função lê uma string da entrada padrão (stdin) até encontrar o caractere de nova linha (‘\n’ – Tecla ENTER) ou de fim de arquivo, que é então substituído pelo caractere de terminação ‘\0’, automaticamente. A string introduzida é transferida para o endereço apontado pela variável Str. O valor de retorno dessa função é um ponteiro para o endereço base associada a string Str. Se, ocorrer um erro, então um NULL é retornado. S t r i n g s Conceitos Básicos Funções Específicas para leitura/Impressão de Strings Impressão: (<stdio.h>) int puts(const char *String) // protótipo Essa função imprime a string passada como argumento (conteúdo do endereço) no dispositivo padrão de saída (stdout = monitor) e muda para a próxima linha, ou seja, após imprimir a string, a função acrescenta um caractere de nova linha (‘\n’). O valor de retorno dessa função é maior (igual) que 0 (zero) (SUCESSO), ou, menor que 0 (zero), no caso de fracasso. S t r i n g s Conceitos Básicos Inicialização de Strings ... #define MAX 100 char string1[MAX] = “Batata doce!!!”; char NomeArq[MAX] = {‘a’,’r’,’q’,’1’,’.’,’c’,’\0’}; char *str = “Eu adoro programar recursivamente!!!”; É possível inicializar strings no momento de sua declaração, e, automaticamente o caractere nulo é acrescentado. Se você colocar o caractere de nova linha (‘\n’), ele será contado como um caractere. Lembre-se, não é possível usar o operador de atribuição para associar strings a variáveis. S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Devolve o tamanho da string (número de caracteres sem o caractere nulo) associada ao endereço que foi passado como argumento. int strlen(const char *String) // protótipo Cabeçalho <string.h> : Amplo conjunto de primitivas para manipulação de strings. A palavra reservada const é um qualificador que não permite que os objetos pré-fixados por ele sejam modificados. S t r i n g s Funções Alternativas // Comprimentos alternativos de uma string int Funcao_Comprimento_Strings1(const char *Str1) { int i = 0; for ( ; *(Str1 + i) != '\0'; i++ ); return(i); } // Funcao_Comprimento_Strings1 int Funcao_Comprimento_Strings2(const char *Str1) { const char *sp = Str1; while ( *( sp++ ) ); return(sp - Str1 - 1); } // Funcao_Comprimento_Strings2 S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Anexa/Concatena/merge duas strings. Uma cópia do conteúdo do segundo parâmetro que identifica a 2ª string é anexado ao conteúdo da 1ª string, cujo apontador é Str1. char *strcat(char *Str1, const char *Str2); Observações: Æ A 2ª string não é alterada; Æ Essa função não verifica se a 2ª string “cabe” no espaço reservado para a 1ª string. Essa responsabilidade é do Programador; Æ O primeiro caractere associado a Str2 sobrepõe o caractere de terminação relativo a Str1; Æ O caractere de terminação de Str2 é associado a Str1; Æ Um ponteiro parao endereço associado a Str1 é retornado. S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Copia a string associada ao endereço apontado por Str2 para a string cujo apontador é Str1. O conteúdo do segundo parâmetro que identifica a 2ª string é copiado para o endereço da 1ª string, que está sendo apontado por Str1. char *strcpy(char *Str1, const char *Str2); Observações: Æ O array associado ao apontado Str1 deve ser grande o suficiente para conter o conteúdo do array apontado por Str2, mais o caractere de terminação; Æ Um ponteiro para a Str1 é retornado; Æ Não é possível alterar o conteúdo de Str2. S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Compara as strings Str1 e Str2, caractere a caractere e retorna a diferença do valor ordinal (tabela ASCII) entre os dois primeiros caracteres diferentes. int strcmp(const char *Str1, const char *Str2); strcmp(Str1,Str2)= -1 se Str1 < Str2 0 se Str1 = Str2 1 se Str1 > Str2 -1, 0, 1 S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings int strcmp(const char *Str1, const char *Str2); Observações: Æ A comparação é no sentido alfabético (ordem lexicográfica), não em relação ao tamanho das strings; Æ ‘A’ < ‘B’ < ...< ‘Z’ < ‘a’ < ‘b’< ... < ‘z’. (Lembrem-se do código/tabela ASCII) Str1 Str2 Valor Retornado “AA” “Ae” -1 “CC” “CC”’ 0 “BA” “AB” 1 “a” “z” -1 “2” “19” 1 “Maria” “Mario” -1 “Mario” “Maria” 1 S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings A Biblioteca Padrão <string.h> possui ainda outras funções de comparação. strncmp(.): Compara somente os n primeiros caracteres de cada string; stricmp(.): não é sensível as diferenças entre caracteres maiúsculos e minúsculos (case insentitive); strincmp(.): versão insensitiva para comparar os n primeiros caracteres; S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Verifica se o caractere Ch ocorre na string Str1. char *strchr(const char *Str1, int Ch); Se ocorrer, retorna um ponteiro para o endereço do caractere relativo a primeira ocorrência de Ch em Str1. Caso contrário, retorna NULL. Retorna o endereço da última ocorrência do caractere Ch em Str1. Caso contrário, retorna NULL. char *strrchar(const char *Str1, int Ch); S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Conversão de strings para valores numéricos Uma boa maneira de evitar erros de entrada é realizar a leitura dos valores (inteiros ou reais) através de uma string. Em seguida convertê-la para os formatos apropriados. Se a leitura for de valor inteiro, então a string só poderá conter os caracteres decimais ( ‘0’ ... ‘9’ ) e os caracteres ‘+’ e ‘-’. Se houver qualquer outro caractere presente, então um erro poderá ser reportado, exatamente na posição em que ocorreu. Se a leitura for de valor real, então a string só poderá conter os caracteres decimais ( ‘0’ ... ‘9’ ), os caracteres (‘.’), ‘e’, ‘E’, ‘+’ e ‘-’. Exercício: Desenvolva funções para garantir a correção de dados numéricos (inteiros e reais) de entrada. S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Conversão de strings para valores numéricos int *atoi(const char *Str1); // <stdlib.h> A biblioteca padrão possui várias funções para conversão de strings em seus respectivos valores numéricos. ”1234” = 1234 “12abc” = 12 “abcd” = 0 “12 34” = 12 Processa todos os dados até que um dígito não numérico seja encontrado. Reconhece os caracteres ‘+’ e ‘-’. S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Conversão de strings para valores numéricos double atof(const char *Str1); // <stdlib.h> ”123.456” = 123.456 “87abc” = 87.000000 “8.7ab” = 8.700000 “12345e02” = 1.2345e+04 Processa todos os dados até que um dígito não numérico seja encontrado. Reconhece os caracteres ‘e’, ‘E’, ‘+’ e ‘-’. (‘e’, ‘E’ : formato exponencial) S t r i n g s Conceitos Básicos Funções Básicas para Manipulação de Strings Conversão de strings para valores numéricos As funções para conversão de strings em seus respectivos valores numéricos: atoi(), atol() e atof(), são antigas e foram substituídas por outras mais avançadas no decorrer da evolução da linguagem. Nas próximas aulas iremos abordá-las. S t r i n g s Exercícios Embora existam um conjunto significativo de funções primitivas para manipular strings, é importante criar seus próprios códigos para as funções abaixo, objetivando aumentar seu nível de conhecimentos e habilidades de programação com arrays e dados do tipo strings. 01) Aproveite seu tempo livre para elaborar versões das funções abaixo: strlen(); strcpy(); strcat(); strcmp(); 02) Dado as strings Str1 e Str2 com tamanhos m e n ( m ≥ n ), respectivamente, elabore uma função para verificar se Str2 ocorre (está presente) na string Str1. Em outras palavras, se Str1 contém Str2. Esse problema é conhecido como “casamento de padrões” (pattern matching) e encontra aplicações em várias áreas do conhecimento. S t r i n g s Exercícios 03) Elabore uma função para inverter uma string. 04) Elabore uma função para verificar o número de ocorrências de um caractere numa string. 05) Elabore uma função para converter todos os caracteres alfabéticos de uma string para minúsculas (maiúsculas). 06) Elabore uma função para verificar se uma string é palíndromo. Ana A torre da derrota. A man, a plan, a canal, Panama Men, I'm Eminem Para cada uma das funções que for elaborar, tome suas próprias decisões em relação aos parâmetros e valores de retorno de cada uma delas. S t r i n g s Biblioteca Padrão <ctype.h> int isalnum(int Ch); 06) Elabore suas próprias versões das funções abaixo, existentes no cabeçalho <ctype.h>. Na dúvida, consulte qualquer livro sobre C que tenha informações sobre a biblioteca padrão. Uma olhada na Tabela ASCII também ajuda. Manipulação de Caracteres int isalpha(int Ch); int isdigit(int Ch); int islower(int Ch); int isupper(int Ch); S t r i n g s Biblioteca Padrão <ctype.h> Códigos básicos; Problema de Casamento de Padrões ( abordagens algorítmicas); Último Trabalho Prático (Laboratório) sobre o tema. Próxima Aula Finalmente vamos descobrir a razão da linha: int main(int argc, char **argv) S t r i n g s Alguns Livros (importância do tema) S t r i n g s Alguns Livros (importância do tema) S t r i n g s Alguns Livros (importância do tema)
Compartilhar