07 strings.pdf
TRANSCRIPT
-
Alexandre Mota [email protected]
-
Na linguagem de programao C, uma frase (ou string) no um tipo de dado especfico
Faz-se simplesmente o reuso do tipo de dado bsico char
Assim, uma string de tamanho 10 declarado como: char nome[10];
-
Tal qual um vetor tradicional, uma string pode ser inicializada na declarao
Da seguinte forma: char nome[10] = Joao;
Note que como um vetor tambm poderia ser inicializado assim: char nome[10] = { J, o, a, o, \0};
Aparece um curioso caracter \0 no final. Ele marca o final da string
-
Strings usam aspas e apstrofos so para caracteres individuais
A string Joao (4 caracteres visveis) na verdade correspondem seqncia { J, o, a, o, \0 }
O caracter \0 que marca o final da string ocupa uma posio
Assim, para a declarao char nome[10], na verdade temos no mximo 9 caracteres teis a usar
-
Este caracter especial usado para demarcar o final da string
E permitir que tamanhos variveis possam ser usados sem usurio se preocupar em controlar isto
Casos extremos (para char nome[10]): Um nome vazio seria nome[0] = \0; Um nome cheio seria nome = abcdefghi;
-
O comando bsico para isto o scanf Supondo que temos uma string chamada
nome O comando
scanf(%s, nome); Carrega o que for digitado pelo teclado
nesta varivel Note que a varivel no tem o & como
prefixo. Isto ser explicado posteriormente
Infelizmente este comando, com estes parmetros, s l
strings sem espaos internos!
-
Para ler strings com espaos internos, precisamos usar esta nova configurao scanf( %[^\n], nome);
O espao antes de % instrui C a descartar espaos antes da primeira palavra
A seqncia de controle ^\n instrui C a ler toda a seqncia de caracteres at encontrar um \n ()
Mas esta configurao ainda tem um problema. O caracter \n no pode surgir alm do que a string
comporta (Violao de memria)!
-
Faa um programa em C que leia seu primeiro e ltimo nomes, bem como seu sexo (como char M ou F), e mostre na tela o seguinte:
Sr. ltimo, Primeiro (se for Masculino) Sra. ltimo, Primeiro (se for Feminino)
Obs.: Com char usa-se e como vetor de chars (strings), usa-se
-
Precisamos garantir que a string lida caber na varivel, sem violar limites de memria
Ento, supondo a declarao char nome[21];
Usamos a seguinte configurao scanf( %20[^\n], nome);
Note o 20 vs 21 entre declarao e scanf. Por que isto ocorre?
-
A funo gets bem mais simples que a funo scanf
Para ler string nome, basta gets(nome);
A sua nica desvantagem que no limita o tamanho de uma string lida
Pode violar memria e causar mal funcionamento do programa
-
Como strings so vetores, h comandos especiais para lidar com elas
Por exemplo, no se pode atribuir uma string diretamente exceto na inicializao char nome[10]; nome = Alex; // Est incorreto!!!
preciso usar uma biblioteca chamada string.h, onde h vrias funes pr-definidas
-
O simples comando de atribuio nome = Alex;
O qual est incorreto, deve ser substitudo pela funo (correto) strcpy(nome, Alex);
A funo strcpy (string copy) est definida na biblioteca string.h, a qual se faz necessria para compilar corretamente tais programas
-
Por trs da funo strcpy strcpy(novo, antigo); // Equival. a novo = antigo
H um programa bem simples Este programa copia cada posio do
vetor (string) antigo para a posio correspondente no vetor (string) novo
Algo como: i = 0;
while(antigo[i]!=\0) { novo[i] = antigo[i]; i++ }
-
Note pelo cdigo anterior que o comando de atribuio no existe para strings
Mas a funo strcpy definida em termos do comando de atribuio entre elementos de vetores
Caracter especial \0 serve de ponto de parada, como j havamos dito anteriormente
-
Do mesmo modo que temos o comando x = x + 2 para inteiros
Temos um correspondente para strings a funo strcat (string catenation) Uma chamada como
strcat(novo, antigo); equivalente ao comando (incorreto para
strings) novo = novo + antigo;
-
Faa um programa que declara 2 strings, uma de 30 caracteres e outra de 15 caracteres. Leia do teclado ambas as strings mas com no mximo 14 caracteres cada. Concatene a string de 15 caracteres ao final da de 30 sem usar o comando strcat. Apresenta a string resultante.
-
Alm de no termos atribuio, tambm no podemos comparar strings como os demais tipos
Por exemplo, enquanto podemos fazer x == y, ou x < y
para nmeros e at caracteres Para strings, precisamos usar a funo
strcmp (string comparison)
-
A chamada strcmp(string1, string2)
retorna um nmero inteiro H 3 casos possveis:
0 significa que string1 e string2 so iguais Negativo significa que string1 menor que
string2 Positivo significa que string1 maior que
string2
-
Tal qual a funo strcpy definida, a funo strcmp funciona nos elementos internos dos vetores
Resultado da funo basicamente uma operao aritmtica baseada na i-sima posio dos vetores de caracteres string1[i] string2[i]
Note que expresso d 0 se caracteres forem iguais, > 0 se e < 0 se
-
Faa um programa que resulta no mesmo comportamento da funo strcmp para duas strings de tamanhos 20 e 15 respectivamente.
-
Apesar da declarao definir um tamanho para uma string
Vimos que o caracter \0 permite tamanhos dinmicos
Baseada na posio do caracter \0, a funo strlen resulta no tamanho (nm. natural) dinmico da string
Seu uso : strlen(nome);
-
Como seria a implementao da funo strlen? Faa um programa que exiba este mesmo comportamento.
-
Faa um programa que l uma string de no mximo 10 caracteres e informa ao usurio se ela um palndromo
Isto , se a palavra lida idntida a sua verso invertida Ex.: ama ou anilina ou arara
-
A entrada de dados pelo teclado pode ficar acumulada
Se isto ocorrer, o scanf pode no funcionar corretamente (Pular a entrada)
Se isto ocorrer, voc dever usar: fflush(stdin) [Windows] ou __fpurge(stdin)
[Linux] ou rewind(stdin)
Antes de cada scanf
-
Alexandre Mota [email protected]