55
Computadores Digitais 2 Prof. Rodrigo de Souza Couto

Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Linguagens de Programação – DEL-Poli/UFRJ Prof. Miguel Campista

Computadores Digitais 2

Prof. Rodrigo de Souza Couto

Page 2: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Aula de Hoje

• Cadeias de caracteres (strings)– Caracteres

– Definição e manipulação de strings

– Vetor de strings

– Parâmetros da função main

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Page 3: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

ATENÇÃO

• Esta apresentação foi baseada nos seguinte trabalhos:– Notas de aula do Prof. Marco Casanova da PUC-Rio

• http://www.inf.puc-rio.br/~inf1620/material.html

– Waldemar Celes, Renato Cerqueira, José Lucas Rangel, “Introdução a Estruturas de Dados”, Editora Campus, 2004

– Herbert Schildt, “C Completo e Total”, Makron Books, 3ª edição, 1997

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Page 4: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Parte 1

Programação (linguagem C)

Cadeias de Caracteres (Strings)

Page 5: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Caracteres

• Um texto é representado por uma sequência (ou cadeia) de caracteres

• Tipo char– Caracteres são representados internamente na memória

do computador por códigos numéricos

– 1 byte -> 256 valores distintos

– Tabela de códigos define a correspondência entre caracteres e códigos numéricos

• Ex: Tabela ASCII

– Caractere ‘a’ -> Código 97

– Caractere ‘A’ -> Código 65

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Page 6: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

• Tabela ASCII para alguns caracteres– Normal (32 a 127), Caracteres de Controle (0 a 31) e

Estendida (128 a 255)

0 1 2 3 4 5 6 7 8 9

30 us rs 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 Ç ü

130 é â ä à å ç ê ë è ï

Page 7: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exemplo

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a=85,b=69,c=82,d=74;

...

printf(“%c%c%c%c \n”,a,b,c,d);

printf(“%d%d%d%d \n”,a,b,c,d);

...

• Primeiro printf imprime “UERJ”

• Segundo printf imprime “85698274”

Imprime cada variável no

formato do tipo int

Imprime cada variável no

formato do tipo char

Page 8: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Caracteres

• Constante de caractere– Caractere envolvido com aspas simples

– Evita a utilização de número para identificar caracteres• Não é necessário consultar a tabela ASCII

– Reescrevendo o exemplo anterior• Primeiro printf imprime “UERJ”

• Segundo printf imprime “85698274”

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a=‘U’,b=‘E’,c=‘R’,d=‘J’;

...

printf(“%c%c%c%c \n”,a,b,c,d);

printf(“%d%d%d%d \n”,a,b,c,d);

...

Page 9: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exercício• Crie uma função que retorne 1 se o caractere for um

dígito (um dos caracteres entre 0 e 9), e 0 em caso contrário

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int digito(char c);

Page 10: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exercício• Crie uma função que retorne 1 se o caractere for um

dígito (um dos caracteres entre 0 e 9), e 0 em caso contrário

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int digito(char c){

if ((c>=‘0’) && (c<=‘9’))

return 1;

else

return 0;

}

int digito(char c){

if ((c>=48) && (c<=57))

return 1;

else

return 0;

}

0 1 2 3 4 5 6 7 8 9

40 ( ) * + , - . / 0 1

50 2 3 4 5 6 7 8 9 : ;

Tiramos proveito da codificação sequencial da tabela ASCII

Page 11: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exercício

• Crie uma função que receba uma letra e retorne seu corresponde maiúsculo– Caractere retornado é o mesmo do recebido se esse não

for letra ou já for maiúsculo

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char maiuscula(char c);

Page 12: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exercício

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char maiuscula(char c){

if ((c>=‘a’) && (c<=‘z’))

c = c – ‘a’ + ‘A’;

return c;

} Deslocamento do caractere c em

relação à letra ‘a’

0 1 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

Ex. com letra ‘e’:

‘E’ = ‘e’ – ‘a’ + ‘A’

69 = 101 – 97 + 65

Page 13: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Cadeias de Caracteres (strings)

• Conjunto de caracteres– Representação de palavras, mensagens, textos, etc.

• Não possuem um tipo específico em c

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Então, como podemos representá-las?

Page 14: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Cadeias de Caracteres (strings)

• Conjunto de caracteres– Representação de palavras, mensagens, textos, etc.

• Não possuem um tipo específico em c– Representadas por um vetor de elementos do tipo char

• Vetor terminado pelo caractere nulo (‘\0’)

• Tamanho alocado para o vetor é o número de caracteres mais o um elemento para o caractere ‘\0’

• Funções de manipulação de strings– Recebem como parâmetro vetor de char

– Processam caractere por caractere até encontrarem o valor ‘\0’

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Page 15: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exemplos

• Atribuição de cada elemento char

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[4];

cidade[0] = ‘R’;

cidade[1] = ‘i’;

cidade[2] = ‘o’;

cidade[3] = ‘\0’;

printf(“%s \n”,cidade);

return 0;

}

Declaração de vetor de char

Essencial para caracterizar o vetor

como uma string

printf com identificador de

formato para strings

Page 16: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exemplos

• Código Equivalente: Cadeia de caracteres

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[] = {‘R’,‘i’,‘o’,‘\0’};

printf(“%s \n”,cidade);

return 0;

} Como em qualquer vetor, não é

necessário especificar a dimensão

se todos seu elementos são

inicializados

Page 17: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exemplos

• Código Equivalente: Cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[] = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Page 18: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exemplos

• Código Equivalente: Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[4];

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Constante de cadeia de

caracteres não pode ser

atribuída a um vetor dessa

forma!!!!!

Page 19: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Exemplos

• Alguns exemplos de declarações– Conteúdo delimitado por aspas duplas (“”)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char s1[] = “”;

char s2[] = “Rio de Janeiro”;

char s3[81];

char s4[81] = “Rio”;

string vazia, com apenas um

elemento (caractere ‘\0’)

Vetor com 15

elementos

Permite strings com até 80 caracteres

Apenas os 4 primeiros elementos foram

inicializados

Page 20: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Leitura de caracteres e strings– Através de scanf

– Especificadores de formato definem o comportamento da scanf

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Page 21: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %c– Lê o valor de um único caractere fornecido via teclado

– Diferente dos especificadores %d e %f, a função não ignora caracteres em branco (espaço, tabulação, nova linha)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a;

...

scanf(“%c”,&a);

...

Page 22: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %c– Lê o valor de um único caractere fornecido via teclado

– Diferente dos especificadores %d e %f, a função não ignora caracteres em branco (espaço, tabulação, nova linha)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a;

...

scanf(“ %c”,&a);

...

Se inserirmos um espaço

em branco, a função

ignora os caracteres em

branco que antecedem a

entrada do caractere

Page 23: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %s– Captura strings

– Uso muito limitado• Lê somente uma sequência de caracteres não brancos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %s”,cidade);

...

Se o usuário digitasse

“Rio de Janeiro”, apenas a

string “Rio” seria

armazenada no vetor

Page 24: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %s– Captura strings

– Uso muito limitado• Lê somente uma sequência de caracteres não brancos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %s”,cidade);

...Repare que não é

necessário utilizar o especificador &, já que

cidade é um vetor,

possuindo um valor de

endereço

Page 25: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

• %[aeiou] -> lê sequência de vogais

– Leitura prossegue até se encontra um caractere que não seja vogal

• %[^aeiou] -> inverso do anterior

– Permite capturar nomes compostos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Page 26: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

• %[aeiou] -> lê sequência de vogais

– Leitura prossegue até que se encontra um caractere que não seja vogal

• %[^aeiou] -> inverso do anterior

• Permite capturar nomes compostos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Procede a leitura até

receber um Enter de

entrada

Page 27: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Qual é o perigo dessa

utilização??

Page 28: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Se o usuário digitar mais

de 80 caracteres, um

espaço de memória não

reservado será invadido!

Page 29: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %80[^\n]”,cidade);

...

Para resolver esse

problema, é necessário

especificar o número

máximo de caracteres que

serão capturados

Page 30: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Manipulação de strings– Função que retorna o comprimento de uma string

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int comprimento(char* s) {

int i;

int n = 0; /*contador*/

for (i=0; s[i] != ‘\0’; i++)

n++;

return n;

}

Laço percorre caractere

por caractere até o final da

string

Page 31: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Utilização da função de comprimento

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int comprimento(char* s) {

int i;

int n = 0; /*contador*/

for (i=0; s[i] != ‘\0’; i++)

n++;

return n;

}

int main(void){

int tam;

char cidade[] = “Rio de Janeiro”;

tam = comprimento(cidade);

printf(“A string \”%s\” tem %d caracteres”,cidade,tam);

return 0;

}

Page 32: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Manipulação de strings (exercício)– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig);

Supomos que o vetor dest tem espaço

suficiente para receber o vetor orig

dest vai receber

concatenação de dest

com orig

Page 33: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings• Manipulação de strings (exercício)

– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig) {

int i = 0;

int j;

i = 0;

while ( dest[i] != ‘\0’ )

i++;

for (j=0; orig[j] != ‘\0’; j++){

dest[i] = orig[j];

i++;

}

dest[i] = ‘\0’;

}

Como dest pode já ter

algum caractere, esse

trecho verifica qual é o

próximo índice disponível

(concatenação irá

sobrescrever o ‘\0’ original)

Page 34: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings• Manipulação de strings (exercício)

– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig) {

int i = 0;

int j;

i = 0;

while ( dest[i] != ‘\0’ )

i++;

for (j=0; orig[j] != ‘\0’; j++){

dest[i] = orig[j];

i++;

}

dest[i] = ‘\0’;

}

Copia os elementos a partir do elemento i

Page 35: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings• Manipulação de strings (exercício)

– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig) {

int i = 0;

int j;

i = 0;

while ( dest[i] != ‘\0’ )

i++;

for (j=0; orig[j] != ‘\0’; j++){

dest[i] = orig[j];

i++;

}

dest[i] = ‘\0’;

}

Finaliza a string

Page 36: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings• Manipulação de strings

– Comparação de duas strings• String s1 é maior que s2 quando

– O primeiro caractere no qual s1 difere de s2 possuir código ASCII maior em s1

» Ex: s1 = “abcde” e s2= “abcDe”

– s2 possuir ‘n’ caracteres e os ‘n’ primeiro caracteres de s1 são idênticos aos de s2, mas s1 possui mais que ‘n’ caracteres

» Ex: s1 = “abcdef” e s2= “abcd”

• Retorna 1 se s1 > s2

• Retorna -1 se s1 < s2

• Retorna 0 se forem iguais

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int compara(char* s1, char* s2) ;

Page 37: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Stringsint compara(char* s1, char* s2) {

int i;

for (i=0; s1[i]!= ‘\0’ && s2[i]!= ‘\0’; i++){

if ( s1[i] < s2[i])

return -1;

else if ( s1[i] > s2[i])

return 1;

}

if ( s1[i]==s2[i])

return 0;

else if ( s2[i] != ‘\0’)

return -1;

else

return 1;

}

Compara caractere por

caractere até o término de uma das strings

São iguais pois as duas terminaram no for anterior

s2 ainda não terminou, sendo assim maior que s1

s1 ainda não terminou, sendo assim maior que s2

Page 38: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Biblioteca Padrão do C• Funções de manipulação de string

– #include <string.h>

– Algumas funções• size_t strlen(const char *str)

– Comportamento análogo ao da função ‘comprimento’

• char *strcpy(char *dest, const char *src)

– Comportamento análogo ao da função ‘copia’

– Retorna o endereço da string de destino

• char *strcat(char *dest, const char *src)

– Comportamento análogo ao da função ‘concatena’

– Retorna o endereço da string de destino

• int strcmp(const char *str1, const char *str2)

– Comportamento análogo ao da função ‘compara’

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Page 39: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char cidade[4];

strcpy(cidade,“Rio”);

printf(“%s \n”,cidade);

return 0;

}

“Rio” é um ponteiro para

posição de memória que

possui a sequência de caracteres ‘R’, ‘i’, ‘o’, ‘\0’

Page 40: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char *cidade;

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Também é possível copiar

a string dessa forma. Isso

é possível pois a string

“Rio” é um espaço alocado

em memória

Page 41: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char *cidade;

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Como “Rio” é uma

constante, não é possível

modificar o conteúdo dos elementos de cidade.

Exemplo:

Não é possível fazer cidade[1] = ‘a’ ;

Page 42: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char *cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Mesmo caso para

inicialização de um

ponteiro para char com a

constante de string. Não é

possível modificar seu conteúdo!

Page 43: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char cidade[4];

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Relembrando: Se a

variável for inicializada

como vetor, isso não é

permitido!

Page 44: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char cidade[4] = “Rio”;

cidade[1] = ‘t’;

printf(“%s \n”,cidade);

return 0;

}

Entretanto, vetores

inicializados com uma

string podem ser

modificados!

Page 45: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings

• Cuidado!!!

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[4] = “Rio”;

cidade[1] = “t”;

printf(“%s \n”,cidade);

return 0;

}

Aspas duplas representam

strings. Nesse exemplo “t”

equivale a um vetor

constante com os

elementos “t” e “\0”. Assim,

a atribuição está errada

pois cidade[1] é um char

Page 46: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Strings• Como em qualquer tipo é possível alocar

dinamicamente vetores de caracteres– O Código abaixo copia a string “Rio” para outra posição

e modifica seu conteúdoint main(void) {

char *cop;

int n;

n = strlen(“Rio”);

cop = (char*) malloc((n+1)*sizeof(char));

strcpy(cop,“Rio”);

cop[1] = ‘t’;

printf(“%s \n”,cop);

return 0;

}

Resultado de strlen não

considera ‘\0’

Podemos modificar o vetor cop, já que ele recebe

apenas uma cópia do valor constante “Rio”

Page 47: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Vetor de Strings

• Exemplo para armazenar os nomes dos alunos de uma turma– 50 possíveis alunos

– Nome do aluno com até 80 caracteres

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

#define MAX_ALUNOS 50

#define MAX_NOME 80

char alunos[MAX_ALUNOS][MAX_NOME + 1];

Page 48: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Vetor de Strings

• Função para imprimir os nomes dos alunos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void imprime(int n, char alunos[][MAX_NOME +1]) {

int i;

for (i=0; i<n ; i++){

printf(“%s \n”,alunos[i]);

}

}

Page 49: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Vetor de Strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

#define MAX_ALUNOS 50

#define MAX_NOME 80

char alunos[MAX_ALUNOS][MAX_NOME + 1];

Temos um desperdício de memória muito grande nessa

utilização!

Raramente alunos tem nomes com 80 caracteres. Mas

precisamos garantir que o programa funcionará mesmo nesses

casos.

Como fazer uma forma mais eficiente?

Em cada registro de nome devemos alocar apenas a

quantidade de memória necessária para ele!!

Page 50: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

Vetor de Strings

• Utilização de um vetor com 81 elementos para receber o nome

• Alocação dinâmica de cada linha a partir do comprimento do nome

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Apenas uma string com tamanho máximo permitido e demais

strings com o tamanho necessário!!

Page 51: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Variável que recebe o

nome a ser alocado no vetor

Vetor de ponteiros para

char. Armazena cada registro dos alunos

Page 52: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Lê nome

Page 53: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Verifica o tamanho

Page 54: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Aloca o vetor com o

número mínimo suficiente de caracteres

Page 55: Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais II–DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto • Tabela ASCII para alguns caracteres –

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ % MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Copia o nome para o vetor