Strings
Strings e caracteres
•
Definição:
– É um conjunto de caracteres armazenados num vector.
•
Exemplos de Strings:
– “luis”
– “bolo de chocolate com 2kg de peso”
– “A”
•
Exemplos de Caracteres:
– ‘L’
– ‘<‘
– ‘A’
•
•
Os caracteres são representados por plicas, enquanto as strings são
representadas entre aspas.
Nota: Como em C as strings não são um tipo básico, a única forma de
representar um conjunto de caracteres é recorrendo a um vector (de
caracteres).
26-01-2005
Rui Morgado - TLP
2
Strings
• Uma string não é mais que um vector de caracteres. O
inverso é falso, isto é, um vector de caracteres pode não
ser uma string.
• Exemplo:
– Se declararmos o vector v com 100 posições para o nome e lá
colocarmos Zé, como poderemos saber quais e quantos dos
100 caracteres estamos efectivamente a utilizar?
Z
V[0]
é
…
V[1]
…
…
V[98]
V[99]
• A solução adoptada foi colocar um marcador (um
caracter) que indique quando a string acaba.
26-01-2005
Rui Morgado - TLP
3
Strings
• ‘\0’ Æ Caracter que é universalmente utilizado para
terminar as strings em C.
• O programador deve sempre ter em atenção que na
declaração de uma string terá que contar
obrigatoriamente, com o espaço para o caracter
terminador. Deverá assim incluir-se, sempre, mais uma
posição para o referido caracter.
• Exemplo:
– Declaração de um vector que conterá uma string com 20
caracteres úteis.
char s[21];
– Ou de forma mais legível
char s[20+1]; /* 20 caracteres a usar + 1 para o terminador */
26-01-2005
Rui Morgado - TLP
4
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 */
Sempre que se faz a inicialização automática da string, o compilador
coloca automaticamente o terminador ‘\0’.
No exemplo anterior, as duas primeiras linhas representam a
inicialização de um vector de 20 caracteres com a string “André”. Nas
duas inicializações seguintes o compilador calcula o n.º de caracteres
existentes na string que faz a inicialização, adiciona um (caracter
terminador), sendo por isso criado um vector com a dimensão exacta
para conter a string “André” (Dimensão 6 = 5 + 1).
• Nota: o caracter ‘\0’ cujo o código ASCII é Zero nada tem a
ver com o caracter ‘0’ um outro caracter totalmente
diferente (código ASCII 48).
26-01-2005
Rui Morgado - TLP
5
Vectores de Caracteres e
Strings
• Uma string corresponde, sempre, a um vector de
caracteres com um caracter especial como terminador
(‘\0’).
• Um vector de caracteres pode não conter uma string.
• Exemplo:
– char s[ ] = “aeiou”;
O vector s é inicializado com a string “aeiou”, logo pode-se
considerar uma string pois o compilador coloca,
automaticamente, neste tipo de inicializações, o caracter
terminador. O vector s fica com 6 caracteres de comprimento.
– char vogais[ ] = {‘a’,’e’,’i’,’o’,’u’};
Vector de caracteres (neste caso não é string pois não há a
necessidade de colocar o caracter terminador). Trata-se de um
vector com 5 caracteres (e não 6) que irão ser utilizados
individualmente e não como um todo.
26-01-2005
Rui Morgado - TLP
6
Leitura e Escrita de Strings
• Função printf;
• Função puts (put string);
• Função scanf;
• Função gets (get string);
26-01-2005
Rui Morgado - TLP
7
Função printf
• A função printf recebe como formato uma string, que
pode ser escrita directamente.
• Uma string pode ser escrita como qualquer outra
variável, utilizando um formato próprio %s dentro de
uma função printf.
• Exemplo:
– char NomeProprio[100] = “Carla Marina”;
– char Apelido[50] = “Silva”;
– printf (“Nome : %s, %s \n”, Apelido, NomeProprio);
• Output:
Nome: Silva, Carla Marina
26-01-2005
Rui Morgado - TLP
8
Função puts (put string)
• A função puts permite, unicamente, a escrita de
strings, sejam elas constantes ou estejam
armazenadas em variáveis. O único aspecto a
ter em conta é que, depois de escrita a string, a
função puts faz uma mudança automática de
linha, isto é:
puts (“Hello World”); é equivalente a printf (“Hello World\n”);
26-01-2005
Rui Morgado - TLP
9
Função scanf
• A função scanf permite realizar a leitura
de strings utilizando o formato %s. no
entanto, a variável que recebe a string
NÃO É PRECEDIDA de um & , ao
contrário do que acontece com todos os
outros tipos de variáveis que são enviadas
para o scanf.
26-01-2005
Rui Morgado - TLP
10
Função scanf
• Exemplo:
#include <stdio.h>
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\n",Nome, Apelido);
}
• Output:
Introduza o nome: Rui
Introduza o apelido: Morgado
Nome Completo: Rui Morgado
26-01-2005
Rui Morgado - TLP
11
Função scanf
•
A função scanf lê todos os caracteres até encontrar um
<ESPAÇO>,<TAB>, ou <ENTER>. Quando isso acontece, termina a leitura
e coloca todos os caracteres lidos até essa altura na variável que lhe foi
passada. Em seguida coloca o caracter terminador.
• Exemplo:
#include <stdio.h>
main()
{
char Nome[50];
printf("Introduza o Nome Completo: "); scanf("%s",Nome);
printf("Nome Completo: %s\n",Nome);
}
• Output:
Introduza o Nome Completo: Rui Jorge Pinto Morgado
Nome Completo: Rui
26-01-2005
Rui Morgado - TLP
12
Função gets (get string)
•
Permite colocar, na variável que recebe por parâmetro, todos os caracteres
introduzidos pelo utilizador. Ao contrário do scanf, esta função não está
limitada à leitura de uma única palavra.
• Exemplo:
#include <stdio.h>
main()
{
char Nome[50];
printf("Introduza o Nome Completo: ");
gets(Nome);
printf("Nome Completo: %s\n",Nome);
}
• Output:
Introduza o Nome Completo: Rui Jorge Pinto Morgado
Nome Completo: Rui Jorge Pinto Morgado
26-01-2005
Rui Morgado - TLP
13
Principais Funções de
Manipulação de Strings
strlen
int strlen (char *s) /* String Length*/
{
int i=0;
while (s[i] != ‘\0’)
i++;
return i;
}
• Devolve o número de caracteres existentes na
string s (sem contar o ‘\0’)
26-01-2005
Rui Morgado - TLP
15
isnull
int isnull (char *s)
{
return (s[0] == ‘\0’);
}
• Esta função não faz parte da linguagem
• Verifica se uma string contém ou não algum
caracter, devolvendo o valor lógico
correspondente.
26-01-2005
Rui Morgado - TLP
16
strcpy
char *strcpy (char *dest, char *orig)
{
int i;
for (i=0; orig[i] != ‘\0’; i++)
dest[i] = orig[i];
dest[i] = ‘\0’;
return dest;
}
• Esta função copia a string orig para a string dest.
26-01-2005
Rui Morgado - TLP
17
strcat
char *strcat(char *dest, char *orig)
{
int i, len;
for (i=0, len=strlen(dest);orig[i] != ‘\0’ ; i++, len++)
dest[len]=orig[i];
dest[len]=‘\0’;
return dest;
}
• Coloca a string orig imediatamente a seguir ao final da string
dest, não colocando qualquer caracter (nem espaços) a
separar as duas strings.
26-01-2005
Rui Morgado - TLP
18
strcountc
int strcountc (char *s, char ch)
{
int i, conta;
for (i=conta=0; s[i] !=‘\0’; i++)
if (s[i]==ch) /*se for o caracter que procuramos*/
conta++;
return conta;
}
• Devolve o n.º de ocorrências do caracter ch na string s:
– strcountc(“abacate”,’a’)
– strcountc(“abacate”,’y’)
26-01-2005
Æ 3
Æ 0
Rui Morgado - TLP
19
strcountd
int strcountd (char *s)
{
int i, conta;
for (i=conta=0; s[i] !=‘\0’; i++)
if (isdigit(s[i])) /*se o caracter for um difito*/
conta++;
return conta;
}
• Devolve o n.º de digitos na string s:
– strcountd(“15 abacates”)
– strcountd(“quinze abacates”)
•
.. 2
.. 0
Para utilizar a função isdigit, terá de fazer #include <ctype.h>, no
inicio do ficheiro.
26-01-2005
Rui Morgado - TLP
20
indchr
int indchar (char *s, char ch)
{
int i;
for(i=0; s[i]!=‘\0’; i++)
if (s[i]==ch)
return i;
return -1;
}
• Devolve o índice em que ocorre a primeira ocorrência do caracter ch na
string s.
• Se o caracter não existir devolve -1, pois zero é um índice possivel
(primeiro elemento da string).
– indchr (“15 abacates”,’a’)
– indchr (“15 abacates”,’#’)
26-01-2005
Æ3
Æ0
Rui Morgado - TLP
21
strrev
char *strrev (char *s)
int i, len;
char aux;
for (i=0, len=strlen(s)-1;i<len;i++,len--)
{aux=s[i];
s[i] = s[len];
s[len] = aux;}
return s;
}
• Inverte a string e devolve-a invertida.
26-01-2005
Rui Morgado - TLP
22
strcmp
int strcmp (char *s1, char *s2)
{
int i=0;
while (s1[i]==s2[i] && s1[i]!=‘\0’)
i++;
return (s1[i] – s2[i]);
}
• Compara a string s1 e s2 alfabeticamente
• Devolve um inteiro:
<0
0
>0
26-01-2005
Se s1 é alfabeticamente menor que s2
Se s1 e s2 são iguais
Se s1 é alfabeticamente maior que s2
Rui Morgado - TLP
23
strpad
char *strpad (char *s)
{
int i=strlen(s);
s[2*i] = s[i]; /*colocar o terminador numa nova posição*/
for(i--; i>=0; i--)
{
s[2*i]=s[i];
s[2*i+1] = ‘ ‘;
}
return s;
}
• Coloca um espaço em branco a seguir a cada um dos caracteres da
string s:
– char s[20] =“olá”;
– strpad(s);
– printf(s);
Æolá
26-01-2005
Rui Morgado - TLP
24
strdelc
char *strdelc (char *s, char ch)
{
int i,j;
for (i=j=0; s[i] != ‘\0’; i++)
if(s[i]!=ch)
s[j++]=s[i];
s[j]=‘\0’;
return s;
}
• Apaga todas as ocorrências do caracter ch na string s.
• Apagar o caracter não é subtituí-lo por um caracter em branco.
Apagar corresponde a retirá-lo, efectivamente, da string.
– strdelc (“apaga caracteres”,’a’) Æ “pg crcteres”
– strdelc (“apaga caracteres”,’e’) Æ”apaga caractrs”
26-01-2005
Rui Morgado - TLP
25
Funções mais utilizadas
strlen Æ Devolve o comprimento de uma string
strcpy Æ 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 Æ Procurar um caracter numa string
strstr Æ Procurar 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
• Para aceder a estas funções terá de incluir a bliblioteca
string.h
•
•
•
•
•
•
•
•
– #include <string.h>
26-01-2005
Rui Morgado - TLP
26
Download

Aula 9 T - Rui Morgado