Strings Manipulação LPG – I Prof. Flavio Marcello 2 Manipulação de Strings Em linguagem "C" não existe o tipo string. A utilização desse tipo de variável se dá através da utilização de um cadeia de caracteres, ou seja, um vetor de caracteres terminados por um nulo (\0). Para implementar esse tipo de dado deve-se ter sempre um caracter a mais para armazenar o terminador nulo. LPG-I 3 Manipulação de Strings Para declarar um tipo string: char nome[10]; Na memória a estrutura armazenamento que se forma é: nome F 0 LPG-I L 1 A 2 V 3 I 4 O 5 \0 6 7 8 9 de 4 Manipulação de Strings Declaração de Tipos Caracteres char sexo; char nome[35]; char s[256]; sexo é uma variável que irá armazenar apenas um caractere denotado por apóstrofes ou aspas simples (ex. 'M' ou 'F'). nome é uma variável string que sustenta um máximo de 35 caracteres. s é uma string capaz de armazenar 256 caracteres, que a linguagem C indexa de s[0] até s[255]. Como a string pode conter menos que 256 caracteres, a linguagem C usa o caractere NULL para representar o último caractere da string. LPG-I Caractere NULL (\0) É responsabilidade dos programas que manipularem strings garantir que o caractere NULL esteja presente. O programa a seguir, define uma string de 256 caracteres, e, depois, atribui as letras maiúsculas do alfabeto aos primeiros vinte e seis caracteres da string: #include "stdio.h" void main() { char s[256]; for (int i=0; i<=25; i++) s[i] = 'A' + i; // garante o caractere “NULL” no final da cadeia s[i] = NULL; // ou s[i] = '\0'; printf("A string contém\n"); printf("%s", s); } LPG-I 5 6 Manipulação de Strings Para fazer a entrada de dados utilizamos as funções de entrada: gets(nome); // mais utilizado pois aceita qualquer tipo de caracter. ou scanf("%20s",nome); // não aceita espaço em branco (limitada), o 20 limita a 20 carateres, truncando a string. Não utiliza & pois a primeira posição da string contém o endereço de memória. LPG-I Operação de “leitura” de strings A função scanf() é adequada para a leitura de dados numéricos e limitada para a leitura de strings. Para contornar este problema deve-se fazer uso da função de entrada de dados: gets(), pois o propósito desta função é efetuar leitura de dados do tipo string fornecidos via teclado. A função gets() aceita caracteres em branco no meio da string e coloca o caractere de controle '\0' somente quando for pressionada a tecla <ENTER>. Observe o exemplo a seguir: #include "stdio.h" void main() { char nome[35]; printf("Digite o seu nome:\n"); gets(nome); printf("\nSeja bem vindo, %s.", nome); } LPG-I 7 Aprendendo como 'A' difere de "A" Como foi definido, uma string de caracteres é uma seqüência de zero ou mais caracteres ASCII que a linguagem C tipicamente finaliza com NULL. Quando se trabalha com caracteres dentro de C, pode-se usar o ASCII numérico de um caractere ou pode-se colocá-lo dentro de apóstrofes, tal como 'A'. Por outro lado, quando é usado aspas, tal como "A", C cria uma string de caracteres que contém a letra especificada (ou letras), e finaliza a string com o caractere NULL. A 'A' A \0 "A" Como a linguagem C armazena de forma diferente, as constantes de caractere e string não são iguais, e é necessário tratá-las de forma diferente dentro dos programas. LPG-I 8 Acrescentando “aspas” em uma String Para criar uma constante string, o programa deverá colocar os caracteres desejados dentro de aspas: "Isto é uma constante de string" Dependendo do programa, algumas vezes uma constante string deverá conter um caractere aspas, por exemplo: "Pare!", ele disse. Como a linguagem C usa as aspas para delimitar as constantes string, é necessário ter uma forma de dizer ao compilador que deseja-se incluir aspas dentro da string. Para fazer isso, deve-se usar a seqüência de escape \", como demonstrado a seguir: "\"Pare!\", ele disse." LPG-I 9 10 Manipulação de Strings Para manipular as informações armazenadas em uma string podemos utilizar as funções string ou utilizamos as funções de manipulação de caracter, já que uma string é um vetor de caracteres. LPG-I Funções de Manipulação de Strings <string.h> strcpy() - copia uma string em outra. Forma Geral : strcpy (s1,s2); // copia o conteúdo de s2 em s1. strcmp() - compara duas strings. Forma Geral : x=strcmp(s1,s2); // menor quando s2 < 0; iguais s2== 0 e maior quando s2 > 0 strcat() - junta o conteúdo de duas strings. Forma Geral : strcat(s1,s2); // s1 irá conter o resultado da junção das 2 strings. LPG-I 11 Funções de Manipulação de Strings <string.h> strlen() - fornece o tamanho de uma string. Forma Geral : x=strlen(s1); // x vai conter o número de caracteres ocupados na string . strchr() – verifica se um caracter pertence a string. Forma Geral : strschr(s1,ch); // verdadeiro se existir o caracter ou falso se não existir. strstr() – verifica se uma string existe dentro da outra string. Forma Geral : strstr(s1,s2); // verdadeiro se s2 existir em s1 ou falso se não existir. LPG-I 12 biblioteca <string.h> Determinando o “tamanho” de uma string 13 Muitas das operações realizadas, em variável do tipo string, são executadas com base no número de caracteres, ou tamanho, da string. A maioria dos compiladores C fornece uma função strlen, que retorna o número de caracteres em uma string. #include "stdio.h" #include "string.h" void main() { char nome[35] = "Flavio Marcello Strelow"; printf("%s contém %d caracteres.", nome, strlen(nome)); } LPG-I biblioteca <string.h> Atribuindo, ou copiando caracteres strcpy(destino, fonte); copia, ou atribui o conteúdo da string fonte para a string destino. #include "stdio.h" #include "string.h" void main() { char nome[35]; strcpy(nome, "Flavio Marcello Strelow"); printf("%s.", nome); } LPG-I 14 biblioteca <string.h> Anexando, ou concatenando caracteres strcat(destino, fonte); anexa, ou concatena, o conteúdo da string fonte no final da string destino. #include "stdio.h" #include "string.h" void main() { char nome[35] = "Flavio"; strcat(nome, " Marcello"); strcat(nome, " Strelow."); printf("%s.", nome); } LPG-I 15 biblioteca <string.h> Coparando duas cadeias de caracteres int strcmp(s1, s2); compara duas strings “exatamente”, ou seja, caracteres minúsculos são considerados diferentes e maiores que os respectivos caracteres maiúsculos. int strcmpi(s1, s2); compara duas strings sem “case sensitivity”, ou seja, não diferencia caracteres minúsculos de caracteres maiúsculos. estas duas rotinas retornam um valor inteiro com o resultado da comparação: resultado < 0 se s1 < s2 resultado == 0 se s1 == s2 resultado > 0 se s1 > s2 LPG-I 16 biblioteca <string.h> Coparando duas cadeias de caracteres #include "stdio.h" #include "string.h" void main() { char s1[3] = "aaa", s2[3] = "bbb", s3[3] = "ccc"; if (strcmp(s2, s1) > 0) printf("s2 eh maior que s1.\n"); else printf("s2 eh menor que s1.\n"); if (strcmp(s2, s3) > 0) printf("s2 eh maior que s3.\n"); else printf("s2 eh menor que s3.\n"); } LPG-I 17 biblioteca <string.h> Convertendo uma string para maiúsculas char *strupr(s); converte a string s para “maiúsculas”. char *strlwr(s); converte a string s para “minúsculas”. #include "stdio.h" #include "string.h" void main() { char nome[35] = "Flavio Marcello Strelow"; printf("%s.\n", strupr(nome)); printf("%s.\n", strlwr(nome)); } LPG-I 18 Funções de Manipulação de Caracteres <ctype.h> 19 isdigit() - verifica se o caracter é um número de 0-9. Forma Geral : isdigit(a); // !=0 é número; =0 não é número. isalpha() - verifica se o caracter é uma letra . Forma Geral : isalpha(a); // !=0 é letra; =0 não é letra. isupper() - verifica se um caracter está em maiúscula. Forma Geral : isupper(a); // !=0 é maiúscula =0 não é. islower() - verifica se um caracter está em minúscula. Forma Geral : islower(a); // !=0 é minúscula =0 não é. LPG-I Funções de Manipulação de Caracteres <ctype.h> 20 ispunct() - verifica se um caracter é ponto. Forma Geral : ispunct(a); // !=0 é ponto =0 não é. isspace() - verifica se um caracter é espaço. Forma Geral : isspace(a); // !=0 é espaço; =0 não é. toupper() - transforma um caracter em letra maiúscula. Forma Geral : a=toupper(a); // o conteúdo de a em maiúscula. tolower() - transforma um caracter em letra minúscula. Forma Geral : a=tolower(a); // o conteúdo de a em minúscula LPG-I biblioteca <string.h> e <ctype.h> Convertendo um caractere para maiúsculo char toupper(ch); converte o caractere ch para o correspondente maiúsculo. #include "stdio.h" #include "string.h" #include "ctype.h" void main() { char nome[35] = "Flavio Marcello Strelow"; char maiusculas[35]; for (int i=0; i<strlen(nome); i++) maiusculas[i] = toupper(nome[i]); maiusculas[i] = NULL; printf("%s.", maiusculas); } LPG-I 21 biblioteca <string.h> e <ctype.h> Convertendo um caractere para minúsculo char tolower(ch); converte o caractere ch para o correspondente minúsculo. #include "stdio.h" #include "string.h" #include "ctype.h" void main() { char nome[35] = "Flavio Marcello Strelow"; char minusculas[35]; for (int i=0; i<strlen(nome); i++) minusculas[i] = tolower(nome[i]); minusculas[i] = NULL; printf("%s.", minusculas); } LPG-I 22 Manipulação de Strings 24 Exemplo 01 Determinar o tamanho de uma string. Para determinar o tamanho de uma string use a função strlen( ). Esta função faz parte do arquivo de cabeçalho string.h. Sua sintaxe é: strlen(string) LPG-I 25 Exemplo 01 /* Determinando o tamanho de uma string usando a função strlen() */ #include <stdio.h> #include <string.h> int main() { char string[20]; printf("\n"); printf("Determinando o tamanho de uma string\n"); printf("------------------------------------\n"); printf("\n"); printf("Digite a string :"); scanf("%s",&string); printf("\n"); printf("A string tem %d carateres.\n\n",strlen(string)); return(0); } LPG-I 26 Exemplo 02 Copiar uma string em outra . Para copiar uma string em outra use a função strcpy( ). Esta função faz parte do arquivo de cabeçalho string.h. Sua sintaxe é: strcpy(destino, origem) LPG-I 27 Exemplo 02 /* Copiando uma string em outra usando a função strcpy() */ #include <stdio.h> #include <string.h> int main() { char string1[10], string2[10]; printf(“\nCopiando uma string em outra\n"); printf("----------------------------\n\n"); printf("Digite string1 :"); scanf("%s",&string1); printf(“\nstring1 = %s\n",string1); printf("string2 = %s\n",strcpy(string2,string1)); return(0); } //Na prática, todo conteúdo de string2 é substituído por string1. LPG-I 28 Exemplo 03 Invertendo uma string utilizando a função strrev( ) . Para inverter o conteúdo de uma string use a função strrev( ). Ela faz parte do arquivo de cabeçalho string.h. Sua sintaxe é: strrev(string) LPG-I 29 Exemplo 03 /* Invertendo uma string usando a função strrev() */ #include <stdio.h> #include <string.h> int main() { char string[20]; printf(“\nInvertendo uma string\n"); printf("---------------------\n"); printf("\n"); printf("Entre com a string :"); scanf("%s",&string); printf("\n"); printf("Invertendo ==> %s",strrev(string)); return(0); } LPG-I 30 Strings- Exercício em Classe Exercício 1: Dadas duas palavras diferentes, o programa deverá executar os tópicos a seguir: a) obter o número de caracteres de cada uma das palavras; b) descobrir qual a menor palavra ou indicar se são do mesmo tamanho c) juntar as duas strings em uma variável auxiliar d) copiar a 2a string na 1a string LPG-I 31 Strings- Exercício em Classe Exercício 2: Leia uma string e substitua os seus caracteres por: L – quando for letra, E – quando for espaço, P – quando for ponto e N – quando for número. Exercício 3: Leia um numero com string e converta para float e int. Faca a impressão dos valores, após, converta o valor float para string e o valor int para string, apresentando os valores. LPG-I