Programação II. Strings (Cadeias de Caracteres) Bruno Feijó Dept. de Informática, PUC-Rio

Documentos relacionados
Programação II. Strings (Cadeias de Caracteres) Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Strings (Cadeias de Caracteres) Bruno Feijó Dept. de Informática, PUC-Rio

Referências. Programação de Computadores II. Cap. 7 Cadeias de Caracteres. Caracteres. Tópicos

3 Cadeias de Caracteres

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

Módulo 7 Cadeias de Caracteres

Cadeias de Caracteres (Strings)

Caracteres e Cadeias de Caracteres

Caracteres. Caracteres são representados através de códigos numéricos. Tabela de códigos: Define correspondência entre caracteres e códigos numéricos

cadeia de caracteres (string) INF Programação I Prof. Roberto Azevedo

INF 1007 Programação II

Tratamento de Caracteres

INF 1005 Programação I

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

Estruturas de Dados Aula 6: Cadeias de Caracteres

Linguagem de Programação C. Fluxo de Saída Padrão. Linguagem de Programação C. printf. Fluxo de Saída Padrão. Algoritmos e Lógica de Programação

3.1 - Funções para manipular dados de entrada e saída padrão

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Linguagem C: strings. Prof. Críston Algoritmos e Programação

21 Strings O que são strings? 21.2 Leitura de Strings. Ronaldo F. Hashimoto e Carlos H. Morimoto

Métodos Computacionais. Strings (Vetor de Caracteres)

Char e Strings de Caracteres

6. Cadeia de caracteres

Programação II. Tipos Estruturados. Bruno Feijó Dept. de Informática, PUC-Rio

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Laboratório de Programação 02

Char e Strings de Caracteres

Introdução a Programação. Strings (Vetor de Caracteres)

Computação Eletrônica. Strings. Prof: Luciano Barbosa. CIn.ufpe.br

Aula 3/4: Vetores/Matrizes e Ponteiros

Tabela ASCII de caracteres de controle

INTRODUÇÃO À PROGRAMAÇÃO II VARIÁVEIS COMPOSTAS HOMOGÊNEAS UNIDIMENSIONAIS

Conceitos c++ Prof. Demétrios Coutinho INFORMÁTICA BÁSICA

Apêndice B. Cadeias de Caracteres (Strings)

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Vetores. Vetores. Vetores. Vetores. Vetores. Algoritmos e Lógica de Programação. Vetores

Linguagem C Parte 4 - Extra

Aula 9 Oficina de Programação Strings. Profa. Elaine Faria UFU

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio

Vetores II. Strings Leitura e exibição Biblioteca string.h Operações com Strings. Matrizes Definição de Acesso Operações com Matrizes

Vetores, Matrizes e String

LINGUAGEM DE PROGRAMAÇÃO C AULA 2. Professor: Rodrigo Rocha

Ciclo com Contador : instrução for. for de variável := expressão to. expressão do instrução

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Exercícios de revisão da Linguagem C

AULA 3 Alocação dinâmica de memória: Ponteiros

1 Exercícios com ponteiros

LINGUAGEM C: ARRAYS DE CARACTERES: STRINGS

Aula 3 Constantes e funções de E/S

Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de programação em linguagem C. Exercícios: Structs

MC Teste de Mesa e Comandos Repetitivos

Laboratório de Programação II

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Computação 2. Aula 3. Diego Addan Vetores de caracteres (strings)

Tutorial Extra sobre C. Felipe Santos da Silva

Tipos Abstratos de Dados (TAD)

J. L. Rangel 1. Escreva um programa em C que lê três números inteiros do teclado, e imprime os três números em ordem crescente.

Linguagem de Programação C

Estruturas de Dados Aula 9: Listas (parte 1) 05/04/2011

ECT1203 Linguagem de Programação

Introdução a Funções

1 Exercícios com ponteiros

Conversão Visualg à C++ Prof. Paulo Cesar F. de Oliveira, BSc, PhD

INTRODUÇÃO À LINGUAGEM C

Algoritmos e Estruturas de Dados I

Linguagem C. Introdução à Programação C. Variáveis. Identificadores. Identificadores 12/03/2011 VARIÁVEIS E TIPOS DE DADOS

Strings. Introdução. Definição de strings. Criação/Declaração de strings. Inicialização de strings. Manipulação de strings. Exemplos.

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Profa Rosana Braga

Ponteiros e Tabelas. K&R: Capítulo 5

Representações de caracteres

3. Linguagem de Programação C

Introdução à Ciência da Computação scc-120

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Programação Orientada a Objeto Java

Linguagem C. André Tavares da Silva.

Aula 3:Introdução à Linguagem C

3. Linguagem de Programação C

Trabalho Prático II - Resta 1 Data de Entrega: Conferir no calendário!

Linguagem C Entrada/Saída (console)

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Programação II. Busca em Vetor (search) Bruno Feijó Dept. de Informática, PUC-Rio

Mais sobre Ponteiros em C

Algoritmos e Programação

CURSO BÁSICO DE PROGRAMAÇÃO AULA 15. Revisão Vetores e Matrizes Trabalho

Funções de Entrada e Saída

Módulo 8 Tipos Estruturados

Linguagem de Programação I. Aula 11 Strings

Estrutura de Dados. Cadeia de Caracteres. Roberto Araujo Ago/2013

Comandos de entrada. e saída. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada.

Referências. Linguagem C. Tipos de variáveis em XC8. Tipos de variáveis. Tipos de variáveis em XC 8 Exemplo. Radicais numéricos em C

9. Tipos Abstratos de Dados

3. COMPILAÇÃO E ESTRUTURA BÁSICA DE UM PROGRAMA EM C

Programação II. Vetores Bidimensionais e Vetores de Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

Disciplina de Algoritmos e Programação

INTRODUÇÃO À LINGUAGEM C

CAPÍTULO 2 SISTEMAS DE NUMERAÇÃO E CÓDIGOS

O que é um apontador em C (type pointer in C)?

Transcrição:

Programação II Strings (Cadeias de Caracteres) Bruno Feijó Dept. de Informática, PUC-Rio

Caracteres tipo char: tamanho de char = 1 byte = 8 bits = 256 valores distintos tabela de códigos: define correspondência entre caracteres e códigos numéricos exemplo: ASCII alguns alfabetos precisam de maior representatividade... alfabeto chinês tem mais de 256 caracteres!

Caracteres Código ASCII Códigos ASCII de alguns caracteres (sp representa espaço) (os 32 primeiros caracteres e o último são códigos de controle) 0 1 2 3 4 5 6 7 8 9 30 rs us sp! " # $ % & ' 40 ( ) * +, -. / 0 1 50 2 3 4 5 6 7 8 9 : ; 60 < = >? @ A B C D E 70 F G H I J K L M N O 80 P Q R S T U V W X Y 90 Z [ \ ] ^ _ ` a b c 100 d e f g h i j k l m 110 n o p q r S t u v w 120 x y z ~ del o código de 0 é 48... e o número 0 representa o quê? Exemplo: 82 105 111 32 100 101 32 74 97 110 101 105 114 111 R i o d e J a n e i r o

Caracteres códigos de controle Códigos ASCII de alguns caracteres de controle No. Código Nome: descrição White Spaces em C 0 nul null: nulo \0 7 bel bell: campainha \a 8 bs backspace: volta e apaga um caractere 9 ht tab: tabulação horizontal \t 10 nl newline ou line feed: muda de linha \n 13 cr carriage return: volta ao início da linha 127 del delete: apaga um caractere \b escape sequences são também chamados de white spaces porque eles não são exibidos na tela Em C, o código 10, na realidade, muda de linha e vai para o início. O código 13 apenas volta para o início. O seguinte trecho de programa: char n = 10; char c = 13; printf("abcdef%cghij%c,,\n",n,c); imprime: abcdef,,ij

Constante de Caractere Constante de caractere: É um caractere envolvido com aspas simples: a, 0,... exemplo: 'a' representa uma constante de caractere 'a' resulta no valor numérico associado ao caractere a char c = 'a'; printf("%d %c\n", c, c); printf imprime o conteúdo da variável c usando dois formatos: com o formato para inteiro, %d, imprime 97 com o formato de caractere, %c, imprime a (código 97 em ASCII)

Exercício Conversão de Caractere para Maiúscula int toupper(int c) converte c em letra maiúscula. Requer <ctype.h>. Implemente a sua versão int paramaiuscula(int c): int paramaiuscula(int c) if (c >= 'a' && c <= 'z') // verifica se e minuscula c = (c - 'a') + 'A'; // converte return c;

Vetor (array) de caracteres Exemplo de um vetor de 3 caracteres char a[3]; a[0] = 'p'; a[1] = 'u'; a[2] = 'c'; Os elementos do vetor estão em endereços contíguos de memória a p Podemos definir um ponteiro para um vetor char * p; p = &a[0]; u c 101 102 103 ou ou char * p; p = a; endereços char a[3] = 'p','u','c'; a é o mesmo que &a[0], i.e. o endereço do 1o. elemento Note que *p, *(p+1) e *(p+2) são os valores p, u e c Note que são equivalentes: *(p+2) p[2] *(a+2) a[2] p++; está correto, mas a++; e a = p; não!! (pois nome de vetor não é variável). Array não é ponteiro!!! Defina void f(char * a) ao invés de void f(char a[]) p a p u c 101 102 103

String (Cadeia de Caracteres) Um string é um vetor de caracteres com um terminador o terminador é o caractere '\0' cujo valor numérico é 0 maneiras de definir um string: como array: char a[4] = 'p','u','c','\0'; ou char a[] = "puc"; usando ponteiro: Na memória: a p u como array: c \0 201 202 203 204 char * a = "puc"; usando ponteiro: OBS: se você usar printf("abcdef\0gh\n"); a impressão ignora g, h e \n: abcdef Escrever funções que manipulam strings é basicamente passear com o ponteiro e interromper quando o terminador é encontrado. Veja o exemplo a seguir. a p u c \0 201 202 203 204

Strings Exemplo de função strlen int strlen(char * s) // calcula comprimento de um string int n; for (n=0; *s!= '\0'; s++) n++; return n; ou, de uma forma ainda mais concisa: int strlen(char * s) int n = 0; while (*s++) n++; return n; O teste *s!= '\0' é uma expressão Booleana (que retorna 0 se falso e diferente de zero se verdadeiro). Portanto, lembrando que o valor numérico de \0 é zero, basta verificar o valor de *s, isto é: for (n=0; *s; s++) Se você acha isto estranho, o que você acha que acontece com: if (0) printf( ola ); Resposta: ola nunca será impresso. Troque 0 por 5, -5 ou 2-7 para imprimir o ola. // testa *s e depois incrementa s

Strings Exemplo de função stringcopy Função stringcopy(s,t) que copia t para s. A solução abaixo requer o cuidado de finalizar o s. void stringcopy(char * s, char *t) for(;*t;t++,s++) *s = *t; *s = '\0'; // finaliza s

Strings função stringcopy mais eficiente void stringcopy(char * s, char * t) // copia t para s versao 1 while ((*s = *t)!= '\0') s++; t++; ou void stringcopy(char * s, char * t) // copia t para s versao 2 Primeiro copia *t para *s, depois verifica while ((*s++ = *t++)!= '\0') se *s é diferente de \0 e, por fim, ; incrementa t e s ou void stringcopy(char * s, char * t) // copia t para s versao 3 while (*s++ = *t++) ; Note que nestas soluções, o terminador é sempre copiado.

Strings outras soluções para stringcopy void stringcopy(char * s, char * t) while (*t) *s++ = *t++; *s = '\0'; ou void stringcopy(char * s, char * t) do *s++ = *t; while(*t++);

Constante de String Constante de cadeia de caracteres: representada por seqüência de caracteres delimitada por aspas duplas comporta-se como uma expressão constante, cuja avaliação resulta no ponteiro para onde a cadeia de caracteres está armazenada

Constante de String... define um string literal (constante de string): char s1[] = "Rio de Janeiro"; s1 é um array (vetor) de char, inicializado com a cadeia Rio de Janeiro, seguida do caractere nulo s1 ocupa 15 bytes de memória é válido escrever s1[0]='x, alterando o conteúdo da cadeia para Xio de Janeiro, pois s1 é um vetor, permitindo alterar o valor de seus elementos char* s2 = "Rio de Janeiro"; s2 é um ponteiro para char, inicializado com o endereço da área de memória onde a constante Rio de Janeiro está armazenada s2 ocupa 4 bytes (espaço de um ponteiro) não é válido escrever s2[0]='x, pois não é possível alterar um valor constante. String literals são tipicamente armazenados em memória readonly. Assim, se um ponteiro é inicializado com o endereço de um string literal, qualquer tentativa de modificação dá erro de access violation. No primeiro caso, o string literal inicializa o array criando uma cópia do string literal no espaço alocado estaticamente para o array s1.

Strings e Manipulação de Memória int main(void) char a[] = "puc"; char * b = "puc"; char c[] = 'p','u','c','\0'; char * d; char m[4]; char * n = (char *)malloc(4*sizeof(char)); d = a; printf("a=%s b=%s c=%s d=%s\n", a,b,c,d); printf(" b[1]=%c *(b+1)=%c\n",b[1],*(b+1)); a[1] = 'a'; // o que daria: b[1] = 'a'; e *(b+1) = 'a';??? a=puc b=puc c=puc d=puc b[1]=u Tente entender cada passo strcpy(m,b); m[1] = 'a'; strcpy(n,b); n[1] = 'a'; c[1] = 'a'; d[1] = 'a'; a=pac m=pac n=pac c=pac printf("a=%s m=%s n=%s c=%s d=%s\n", a,m,n,c,d); return 0; *(b+1)=u // b[1] = 'a'; // ERRO! // *(b+1) = 'a'; // ERRO! d=pac Obs: a não é uma variável e não poderíamos fazer a++. Mas podemos fazer d++. Note que b é variável.

Exercício Converte String para Maiúsculas Usando toupper, escreva uma função strupper que converte um string para maiúsculas. Faça uma versão que destrói o string dado e outra que o preserva. #include <ctype.h> #include <stdlib.h> #include <string.h> void strupper1(char * s) for (;*s;s++) *s= toupper(*s); char * strupper2(char * s) char * p, * r; p = (char *)malloc(strlen(s)+1); // +1 for '\0' r = p; // para guardar o p inicial if (p!=null) for (;*p=*s;s++,p++) // for (;*s;s++,p++), faca *p='\0' antes do return *p = toupper(*s); return r;

Exercício Duplica String Escreva uma função strdup que recebe um string e o guarda em uma área de memória segura obtida dinamicamente. Pode usar funções da biblioteca. #include <stdlib.h> #include <string.h> char * strdup(char * s) char * p; p = (char *)malloc(strlen(s)+1); // +1 para \0 if (p!= NULL) strcpy(p,s); return p;

Exercício Compara Strings Escreva uma função strcompara que recebe os strings s e t e retorna negativo, zero ou positivo se s é alfabeticamente menor que, igual a ou maior que t. Dica: a subtração de dois caracteres é uma maneira de compará-los. Versão de ponteiro: Versão de índice de array:

Exercício Concatena Strings Escreva uma função void strconcatena que concatena t no final de s, supondo que s é grande o suficiente. Versão de ponteiro: Versão de índice de array:

Biblioteca de Funções de Strings As funções de string requerem #include <string.h> Algumas das funções mais usadas estão listadas abaixo (onde s e t são char *, c é um int convertido para char, e n é int. char * strcpy(s,t) copia t para s e retorna s char * strncpy(s,t,n) copia n caracteres de t para s e retorna s char * strcat(s,t) concatena t para o final de s e retorna s char * strncat(s,t,n) concatena n caracteres de t para s e retorna s char * strcmp(s,t) compara s a t e retorna <0 se s<t, 0 se s==t, e >0 se s>t char * strncmp(s,t,n) compara n caracteres de s com t char * strchr(s,c) retorna ponteiro para a 1a. ocorrência de c em s (retorna NULL se não encontrar c) char * strrchr(s,c) retorna ponteiro para a última ocorrência de c em s char * strstr(s,t) retorna pointer para 1a. ocorrência do string t em s int strlen(s) retorna comprimento de s O tipo int usado acima (e.g. n e strlen) é, na realidade, o tipo size_t. Dependendo da implementação, size_t é unsigned int ou unsigned long. Para uma programação absolutamente segura, ou você faz um cast para unsigned long ou usa o tipo size_t provido pelo <stddef.h>.

Soluções Usando Índice de Array

Strings função strlen versão índice de array int strlen(char * s) // calcula comprimento de um string int n; for (n=0; s[n]; n++) ; return n; ou, de uma forma menos eficiente (mais uma variável e comparando com \0 ): int strlen(char * s) int i; int n = 0; /* contador */ for (i=0; s[i]!= '\0'; i++) n++; return n;

Strings função stringcopy versão índice array void stringcopy(char * s, char * t) // copia t para s int i; for (i=0; s[i] = t[i]; i++) ; Observe que, no for acima, t[i] é primeiro copiado para s[i] e depois s[i] é testado. Isto é equivalente a for (i=0; (s[i]=t[i])!= \0 ; i++). Uma versão menos eficiente seria: void stringcopy(char * s, char * t) int i; for (i=0; t[i]!= '\0'; i++) s[i] = t[i]; s[i] = '\0'; // fecha o string

Leitura de Caracteres

Leitura de Caracteres e Strings com scanf Especificadores de formato definem o comportamento do scanf scanf com o especificador de formato %c lê o valor de um único caractere fornecido via teclado para pular todos os caracteres brancos antes do caractere: um espaço em branco no formato, antes do especificador Cuidados com scanf char a,b;... scanf("%c",&a); carriage return (\n), assim como qualquer caractere branco (\n, \t,...) é caracter válido e será usado na próxima leitura. Uma solução é usar o fflush para limpar o stream de input (e.g. stdin): char a, b; scanf("%c",&a); scanf("%c",&b); // b ='\n' scanf(" %c",&a); char a, b; scanf("%c",&a); fflush(stdin); scanf("%c",&b); scanf é uma função pesada e mal comportada para caracteres e strings (porém bem comportada para números), o que exige atenção. Para caracteres, há programadores que recomendam getchar (mais leve e rápida). fflush em input stream tem efeito indefinido no ANSI C, ameaçando compatibilidade. Uma alternativa é evitar scanf e fflush para caracteres; neste caso opte por controlar tudo, e.g.: char a; Alternativa pior: scanf(" %c",&b); a = getchar(); while (getchar()!='\n );

Leitura de Caracteres e Strings com scanf cuidados com scanf e formato %c: não pula os caracteres brancos caractere branco = espaço (' '), tabulação ('\t') ou nova linha ('\n') se o usuário teclar um espaço antes da letra: o código do espaço será capturado a letra será capturada apenas na próxima chamada de scanf para pular todos os caracteres brancos antes do caractere: basta incluir um espaço em branco no formato, antes do especificador char a;... scanf(" %c", &a); //branco no formato pula brancos da entrada...

Leitura de Caracteres e Strings com scanf scanf com o especificador de formato %s lê uma cadeia de caracteres não brancos pula os eventuais caracteres brancos antes da cadeia exemplo: char cidade[81];... scanf("%s", cidade);... &cidade não é usado pois a cadeia é um vetor o código acima funciona apenas para capturar nomes simples se o usuário digitar Rio de Janeiro, apenas Rio será capturada, pois %s lê somente uma seqüência de caracteres não brancos

Leitura de Caracteres e Strings com scanf scanf com o especificador de formato %[...] %[...] lista entre os colchetes todos os caracteres aceitos na leitura %[^...] lista entre os colchetes todos os caracteres não aceitos na leitura exemplos: %[aeiou] lê seqüências de vogais leitura prossegue até encontrar um caractere que não seja uma vogal %[^aeiou] lê seqüências de caracteres que não são vogais leitura prossegue até encontrar um caractere que seja uma vogal

Exemplo: Leitura de Caracteres e Strings com scanf lê uma seqüência de caracteres até que seja encontrado o caractere de mudança de linha ('\n') captura linha fornecida pelo usuário até que ele tecle Enter inclusão do espaço no formato garante que eventuais caracteres brancos que precedam a cadeia de caracteres sejam descartados char cidade[81];... scanf(" %[^\n]", cidade);... também pode ser usado " %[^\n]s OBS: se, na leitura de um segundo string, você não usar o branco antes do %, isto fará com que o scanf capture os caracteres brancos deixados na leitura anterior e coloque um string inesperado na variável scanf(" %[^\n]",cidade1); scanf("%[^\n]",cidade2); use scanf(" %[^\n]",cidade1); scanf(" %[^\n]",cidade2); ou scanf("%[^\n]",cidade1); getchar(); scanf("%[^\n]",cidade2);