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