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