![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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/1.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/2.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/3.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/4.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/5.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/6.jpg)
• 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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/7.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/8.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/9.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/10.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/11.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/12.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/13.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/14.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/15.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/16.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/17.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/18.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/19.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/20.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/21.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/22.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/23.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/24.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/25.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/26.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/27.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/28.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/29.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/30.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/31.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/32.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/33.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/34.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/35.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/36.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/37.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/38.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/39.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/40.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/41.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/42.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/43.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/44.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/45.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/46.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/47.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/48.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/49.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/50.jpg)
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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/51.jpg)
#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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/52.jpg)
#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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/53.jpg)
#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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/54.jpg)
#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 –](https://reader033.vdocuments.com.br/reader033/viewer/2022042808/5f8c26ec696b4b25c1446e3a/html5/thumbnails/55.jpg)
#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