Introdução à Programação
Strings
Sumário
„ Caracteres (ASCII)
„
Exercícios
„ Vectores de caracteres
„
Strings
„ Exercícios
Introdução à Programação 2006/2007
Definição
„ Uma string é um conjunto de caracteres armazenados num
vector.
„ Em C, o vector é a única forma de representar strings.
„ Um vector de caracteres pode não sempre ser uma string! Os
caracteres são então usados individualmente e não como um
tudo.
„ O carácter ‘\0’ é usado como terminador da string. O vector de
char tem de ter tamanho suficiente para acomodar a palavra e o
0 (zero) final
char s [20+1]; /* 20 caracteres
a usar + 1 para o terminador */
Introdução à Programação 2006/2007
Inicialização automática de strings
„ Exemplos
char nome[20] = “André”;
char nome[20] = {‘A’,’n’,’d’,’r’,’é’};
char nome[] = “André”; /* Equivalente a char nome [5+1] = “André; ” */
char *nome = “André”; /*
idem */
Introdução à Programação 2006/2007
Leitura de strings
„ Função printf
char nomeProprio [100] = “Carlos Marino”;
char apelido [50] = “Lopes da Silva”
printf (“Nome: %s\, %s\n”, apelido, nomeProprio);
„ Função puts (put string)
Permite unicamente a escrita de strings
Faz automaticamente a mudança de linha
Introdução à Programação 2006/2007
Escrita de strings
„ Função scanf
Usa o formato %s, no entanto, a variável que recebe a string NUNCA É
PRECEDIDA de um &.
#include <stdio.h>
int main ()
{
char nome[50], apelido[50];
printf (“Introduza o nome:”); scanf (“%s”,nome);
printf (“Introduza o apelido:”); scanf (“%s”,apelido);
printf (“Nome Completo: %s %s”, nome, apelido);
}
Realiza apenas a leitura de uma única palavra
Introdução à Programação 2006/2007
Exemplo
Faltam as ‘ ‘ ?
int main () {
char word1[ ]={'P','a','l','a','v','r','a','1',0};
char word2[ ]="Palavra2";
Onde está o 0?
printf ("Word1=\"%s\"\n",word1);
printf ("Word2=\"%s\"\n",word2);
return 0;
}
Introdução à Programação 2006/2007
E se não acabar em 0?
Escrita de strings
„ Função gets
„
„
Permite colocar, na variável que recebe por parâmetro, todos os
caracteres introduzidos pelo utilizador.
Não está limitada á leitura de uma única palavra.
#include <stdio.h>
int main ()
{
char nome[50];
printf (“Introduza o nome completo:”);
gets(nome);
printf (“Introduza o apelido:”);
printf (“Nome Completo: %s ”, nome);
}
Introdução à Programação 2006/2007
Exemplo
int main () {
char palavra1[50];
char palavra2[50];
Quantas letras pode ter palavra1?
Eo&?
Duas palavras coladas ?
printf ("Escreva duas palavras:\n");
scanf ("%s%s", palavra1, palavra2);
printf ("Escreveu:\n\t%s\n\t%s\n", palavra1,palavra2);
return 0;
}
Introdução à Programação 2006/2007
Introdução à Programação 2006/2007
Problema
„ Escreva um programa que leia nomes e os
apresentes no ecrã até que um nome vazio
seja introduzido pelo operador.
Introdução à Programação 2006/2007
Solução
#include <stdio.h>
int main ()
{
char nome[100];
while (1) /* ciclo infinito */
{
puts (“Nome:”);
gets(nome);
if (nome [0] == ‘\0’)
break;
else printf (“Nome Introduzido: %s\n ”, nome);
}
}
Introdução à Programação 2006/2007
Dec.
Simb.
Dec.
Simb.
Dec.
Simb.
Dec.
Simb.
33
!
48
0
93
]
135
ç
34
“
...
...
94
^
136
ê
35
#
57
9
95
_
138
è
36
$
58
:
96
`
141
ì
37
%
59
;
97
a
144
É
38
&
60
<
…
…
147
ô
39
‘
61
=
122
z
149
ò
40
(
62
>
123
{
160
á
41
)
63
?
124
|
161
í
42
*
64
@
125
}
162
ó
43
+
65
A
126
~
163
ú
44
,
...
...
128
Ç
181
Á
45
-
90
Z
130
é
182
Â
46
.
91
[
131
â
183
À
47
/
92
à
198
ã
Introdução à Programação 2006/2007
\
133
http://en.wikipedia.org/wiki/Code_page_850
http://en.wikipedia.org/wiki/ASCII
ASCII American Standard Code for Information Interchange
Exercício 1
„ Faça um programa que leia cada um dos
caracteres de uma frase e as contabilize
separadamente. A frase termina com
‘.<ENTER>’
„
„
„
Conte as letras maiúsculas e minúsculas como
as mesmas (e.g. ‘a’ e ‘A’ contam como a
mesma letra)
Conte os números de ‘0’ a ‘9’
Para ler um carácter use a função getchar();
Introdução à Programação 2006/2007
Exemplo de Solução
int main () {
char c;
int n, letras[26], numeros[10];
for (n=0; n<26; n++) letras[n]=0;
for (n=0; n<10; n++) numeros[n]=0;
printf ("Insira o texto e termine com .<ENTER>:\n");
c=getchar();
while (c!='.') {
if ((c>='a')&&(c<='z')) letras[c-'a']++;
else if ((c>='A')&&(c<='Z')) letras[c-'A']++;
else if ((c>='0')&&(c<='9')) numeros[c-'0']++;
c=getchar();
}
for (n=0; n<26; n++) if (letras[n]>0)
printf ("\t%c : %d\n",n+'A',letras[n]);
for (n=0; n<10; n++) if (numeros[n]>0)
printf ("\t%d : %d\n",n,numeros[n]);
return 0;
}
Introdução à Programação 2006/2007
Introdução à Programação 2006/2007
Exemplo
„ O carácter ® tem na tabela de extensão do
ASCII o valor A9 em hexadecimal (169 em
decimal)
„
Estas duas formas são equivalentes:
printf(“%c”,0xA9);
printf(“%c”,169);
Introdução à Programação 2006/2007
Exercício 2
„ Altere o programa anterior para que passe a
contabilizar o número de letras maiúsculas e
minúsculas
„
O programa deve apresentar o seguinte formato
de saída (com acentuação):
Número de maiúsculas:
Número de minúsculas:
Introdução à Programação 2006/2007
Exemplo de Solução
int main () {
char c;
int n, tamanho[2]={0,0};
printf ("Insira o texto e termine com .<ENTER>:\n");
c=getchar();
while (c!='.') {
if ((c>='a')&&(c<='z'))
tamanho[0]++;
else if ((c>='A')&&(c<='Z'))
tamanho[1]++;
c=getchar();
}
// Mostra a contagem
printf ("N%cmero de mai%csculas: %d\n",163,0xA3,tamanho[1]);
printf ("N%cmero de min%csculas: %d\n",0xA3,163,tamanho[0]);
return 0;
}
Introdução à Programação 2006/2007
Introdução à Programação 2006/2007
Exercício 3
„ Escreva um programa completo que
aceite, pelo teclado, um conjunto de
caracteres terminados com ‘*’ e que
devolva a soma de todos os algarismos
„
Por exemplo, a ‘251ab*’ corresponderá
o valor 8.
Introdução à Programação 2006/2007
Exemplo de Solução
int main () {
char c;
int soma=0;
printf ("Insira o caracteres e termine com *\n");
c=getchar();
while (c!='*') {
if ((c>='1')&&(c<='9'))
soma+=c-'0';
c=getchar();
}
printf ("A soma de todos os algarismos e: %d\n",
soma);
return 0;
}
Introdução à Programação 2006/2007
Exercício 4
„ Faça um programa que peça uma palavra e
devolva o número de caracteres
„
A palavra nunca ultrapassa as 50 letras
Introdução à Programação 2006/2007
Exemplo de Solução
int main () {
char palavra[51];
int contador;
printf ("Escreva a palavra: ");
scanf ("%s", palavra);
for (contador=0;contador<51; contador++)
if (palavra[contador]==0)
break;
printf ("A palavra \"%s\" tem %d letras\n",palavra,contador);
return 0;
}
Introdução à Programação 2006/2007
<string.h>
„ O ficheiro <string.h> declara várias
funções para manipular strings
#include <string.h>
„
Exemplos de funções:
strlen:
stpcpy:
strcat,
strcmp
Introdução à Programação 2006/2007
strlen
devolve o numero de caracteres existentes na
string s (sem contar com o ‘\0 ’)
strlen (“”) ->0
Strlen (“strlen”)->6
Introdução à Programação 2006/2007
Exemplo
#include <stdio.h>
#include <string.h>
int main () {
char palavra[51];
printf ("Escreva a palavra: ");
scanf ("%s", palavra);
printf ("A palavra \"%s\" tem %d letras\n", palavra, strlen(palavra));
return 0;
}
Introdução à Programação 2006/2007
isnull (char *s)
„ Verifica se uma string contém ou não algum
carácter, devolvendo o valor lógico
correspondente:
isnull(“”)
isnull(“strlen”)
.. <true>
.. <false>
Introdução à Programação 2006/2007
char *strcpy
„ Copia a string orig para a string dest
char *strcpy (char *dest, char *orig)
{
inti;
for (i=0 ; orig[i]!=‘\0’;i++)
dest[i] = orig [i];
dest[i]= ‘\0’;
return dest;
}
Introdução à Programação 2006/2007
char *strcat (char *dest,char *orig)
Coloca a string orig imediatamente a seguir ao final da
string dest. (não coloca qualquer caracter a separar
as duas strings).
char *strcat(char*dest, char *orig)
{
inti,len;
for (i=0 ,len=strlen(dest); orig[i]!=‘\0’;i++ ,len++)
dest[len] = orig[i];
dest[len]= ‘\0’;
return dest;
}
Introdução à Programação 2006/2007
Outras funções
„
int strcountc(char *s, char ch)
Devolve o numero de ocorrências do carácter ch na string s.
„
int indchr(char *s, char ch)
Devolve o indice em que ocorre a primeira ocorrência do carácter ch na string s.
„
int strcap(char *s)
Verifica se a string é capicua, isto é, se se lê da mesa forma da esquerda para a direita e da
direita para a esquerda.
„
int *streev(char *s)
Inverte a string e devolve-a invertida.
„
int strcmp(char *s1, char *s2)
Compara as strings s1 e s2 alfabeticamente.
„
int *strpad(char *s)
Coloca um espaço branco a seguir a cada um dos caracteres da string s.
„
int strdelc(char *s, char ch)
Apaga todas as ocorrencias do caracter ch na string s.
Introdução à Programação 2006/2007
Funções mais usadas
„
„
„
„
„
„
„
„
Strlen – devolve o cumprimento de uma string
Strcopy – copia uma string para outra
Strcat – concatenação de strings
Strcmp – comparação alfabética de strings
Stricmp – comparação de strings com ignore case
Strchr – procura um carácter numa string
Strstr – procura uma string dentro de outra
Strlwr – converte todos os caracteres de uma string
para minúsculas
„ Strupr - converte todos os caracteres de uma string
para maiúsculas
Introdução à Programação 2006/2007
Download

Strings