Programação Orientada à Procedimentos II Programação Orientada à Procedimentos I Processamento Paralelo Lógica de Programação Introdução à Computação Informática Básica

 

 

Informática Básica
Introdução à Computação
Lógica de Programação
Programação Orientada à Procedimentos I
Programação Orientada à Procedimentos II

Processamento Paralelo

Aula do dia 13 de Fevereiro

Aula do dia 17 de Fevereiro de 2003

Aula do dia 20 de Fevereiro


Strings

Strings é uma matriz do tipo char que armazena um texto formado de caracteres e sempre terminado pelo caractere zero ('\0'). Em outras palavras, string é uma série de caractres, onde cada um ocupa um byte de memória, armazenados em sequência e terminados por um byte de valor zero. Cada caractere é um elemento independente da matriz e pode ser acessado por meio de um índice.

Visualizando uma String de C

Seu computador requer um byte de memória para armazenar um único caractere ASCII. Como você aprendeu uma string é uma seqüência de caracteres ASCII. Quando você declara uma constante de strings, C automaticamente atribui o caractere NULL. Quando seus programas criam suas próprias strings lendo caracteres do teclado, eles precisam colocar o caractere NULL no final da string para indicar onde ela termina. Portanto o melhor modo para visualizar uma string é como uma colocação de bytes terminados por um caractere NULL.

Como o Compilador representa uma String de Caracteres

Quando você usa uma constante de caracteres dentro de seu programa, o compilador C automaticamente coloca o caractere NULL (\0) no final da string.

Como C Armazena uma String de Caracteres

Para criar uma string de caracteres, você simplesmente declara uma matriz de caracteres, como mostrado aqui:

								
char string [256];

C criara uma string capaz de armazenar 256 caracteres, que C indexa de string[0] até string[255]. Como a string pode conter menos que 256 caracteres, C usa o caractere NULL (ASCII 0) para representar o último caractere da string. C tipicamente não coloca o caractere NULL após o último caractere na string. Em vez disso, funções tais com fgets ou gets colocam o caractere NULL no final da string. À medida que seus programas manipularem strings, é a sua responsabilidade garantir que o caractere NULL esteja presente. O programa a seguir define uma string de 256 caracteres, e, depois, atribui as letras maiúscula do alfabeto aos primeiros vinte e seis dígitos da string:

										
#include <stdio.h>
void main(void)
{
    char string[256];
    int i;
    for (i = 0; i < 26; i++)
        string[i] = ‘A’ + i;
    string[i] = NULL;
    printf ("A string contem %s\n",string);
}

O programa usa o laço for para atribuir as letras A até Z à string. O programa depois coloca o caractere NULL após a letra Z para indicar o final da string. A função printf então exibirá cada caractere na string até o caractere NULL. As funções que trabalham com strings usam o caractere NULL para determinar o final da string. O programa a seguir, também atribui as letras A até Z a uma string de caracteres. No entanto, depois o programa atribui o caractere NULL à string[10], que é a posição que segue imediatamente a letra J. Quando printf exibe o conteúdo da string, ele para na letra J:

										
#include <stdio.h>
void main(void)
{
   char string[256];
   int i;
   for (i = 0; i < 26; i++)
       string[i] = ‘A’ + i;
   string[10] = NULL;
   printf ("A string contem %s\n",string);
}

Nota: quando você trabalha com strings, sempre precisará incluir o caractere NULL para representar o final da string.

Aprendendo como 'A' Difere de "A"

Quando você trabalha com caracteres dentro de C, pode usar o valor ASCII numérico de um caractere ou pode colocar o caractere dentro de apóstrofes, tal como ‘A’ . Por outro lado, quando você usa aspas, tal com "A" , C cria uma string de caracteres que contém a letra especificada (ou letras), e finaliza a string com o caractere NULL. Como C as armazena de formas diferentes, as constantes de caracteres e strings não são iguais, e você precisará tratá-las de forma diferente dentro de seus programas.

Representando uma Aspas dentro de uma Constante de String

Dependendo dos seus programas, algumas vezes uma constante de string conterá um caractere aspas. Por exemplo, assuma que você queira representar a seguinte string:

		"Pare!", ele disse.

Como C usa as aspas para definir as constantes de strings, você precisará ter um modo de dizer ao compilador que quer incluir aspas dentro da string. Para fazer isso, use a seqüência de escape \" , como mostrado aqui:

		"\"Pare!\" ele disse."

O programa a seguir usa a seqüência de escape \" para colocar aspas dentro de uma constante de string:

								
#include <stdio.h>
void main(void)
{
    char string[]= "\"Pare!\" ele disse." ;
}

Determinando o Tamanho de uma String

Funções tais como fgets e cgets automaticamente atribuem o caractere NULL para indicar o final de uma string. O programa a seguir usa a função gets para ler uma string de caracteres do teclado. O programa depois usa um laço for para exibir os caracteres da string em de cada vez até que a condicional string[i] != NULL seja avaliada como falsa.

										
#include <stdio.h>
void main(void)
{
   char string[256]; // string digitada pelo usuário
   int i; // índice para a string
   printf ("Digite uma string de caracteres e pressione Enter: \n");
   gets(string);
   // Exibe cada string de caracteres até que NULL seja encontrado
   for (i = 0; string[i] != NULL; i++)
       printf ("O número de caracteres na string é %d\n", i);
}

Usando a Função Strlen

O formato da função strlen é como segue:

										
#include <string.h>
size_t strlen(const char string);

O programa a seguir ilustra como usar a função strlen:

										
#include <stdio.h>
#include <string.h>
void main(void)
{
    char titulo_livro[] = "Bíblia do programador C/C++, do Jamsa!"; 
    printf ("%s contém %d caracteres\n", titulo_livro,strlen(titulo_livro));
}

Quando você compilar e executar o programa sua tela exibirá o seguinte:

										
Bíblia do programador C/C++, do Jamsa! contém 38 caracteres

Copiando os Caracteres de uma String em Outra

A função strcpy , que copia os caracteres em uma string (o parâmetro origem) em outra string (o parâmetro destino):

					
#include <string.h>
char *strcpy(char *destino, const char *origem);

A função strcpy retorna um ponteiro para o início da string de destino. O programa a seguir ilustra como usar a função strcpy dentro de seus programas.

								
#include <stdio.h>
#include <string.h>
void main(void)
{
   char titulo[] = "Bíblia do programador C/C++, do Jamsa!";
   char livro[128];
   strcpy(livro, titulo);
   printf ("Nome do livro %s\n", livro);
}

Anexando o Conteúdo de uma String em Outra

A função strcat , que concatena (anexa) uma string de origem em uma string-alvo, como mostrado aqui:

								
#include <string.h>
char *strcat(char alvo, const char *origem);

O programa a seguir, ilustra como usar a função strcat:.

								
#include <stdio.h>
#include <string.h>
void main(void)
{
   char nome[64] = "Dálmata macho";
   strcat(nome,"Happy");
   printf ("O nome completo do Happy é %s\n", nome);
}

Quando você compilar e executar o programa sua tela exibirá o seguinte:

								
O nome completo do Happy é Dálmata macho Happy

Anexando N Caracteres a uma String

A função strNcat , que anexa os primeiros n caracteres de uma string de origem em uma string de destino, como mostrado aqui:

								
#include <string.h>
char *strncat(char *destino, const *origem,size_t n);

Se n especificar um número de caracteres maior que o número de caracteres na string origem, strncat copiará caracteres até o final da string e não mais. O programa a seguir ilustra como usar a função strncat:

								
#include <stdio.h>
#include <string.h>
void main(void)
{
   char nome[64] = "Fernando";
   strncat(nome,"e Rute",4);
   printf ("Você votou em %s \n",nome);
}

Quando você compilar e executar o programa sua tela exibirá o seguinte:

								
Você votou em Fernando e Ru

Não Ultrapasse o Tamanho de uma String

char string [10];

Se você atribuir mais de 10 caracteres à string, seu sistema operacional poderá não detectar o erro. Em vez disso, os caracteres que você queria atribuir à string podem sobrescrever as posições de memória que correspondem às outras variáveis. Corrigir um erro de sobrescrita é muito difícil, e o erro também pode fazer seu programa e o sistema operacional interromper a execução. Como regra, declare suas strings ligeiramente maiores do que você acha que será necessário. Fazendo isso, você reduz a possibilidade de sobrescrever uma string. Se seus programas experimentarem erros intermitentes, examine o código de seu programa para determinar se seu programa pode estar sobrescrevendo uma string de caracteres.

Determinando se Duas Strings São ou Não Iguais

	
int streql (char *str1, char *str2)
{
   while ((*str1 == * str2) && (*str1))
   {
       str1++;
       str2++;
   }
   return ((*str1 == NULL) && (*str2 == NULL));
}

A função streql retornará o valor 1 se as duas strings forem iguais, e 0 se as strings não forem iguais. O seguinte programa C, ilustra como usar a função streql:

								
#include <stdio.h>
void main(void)
{
   printf ("Testando Abc e Abc %d\n",streql("Abc","Abc"));
   printf ("Testando abc e Abc %d\n",streql("abc","Abc"));
   printf ("Testando abcd e abc %d\n",streql("abcd","abc"));
}

Quando você compilar e executar o programa, sua tela exibirá a seguinte saída:

								 
Testando Abc e Abc 1
Testando abc e Abc 0
Testando abcd e abc 0

Atenção: O compilador TCLite nao aceita a função streql e nem a strieql, portanto devemos substituí-las pelas funções strcmp e stricmp respectivamente. A função strcmp e a stricmp, retornam os seguintes valores:



< 0 se a string1 for menor que a string2
= 0 se a string1 for igual a string2
> 0 se a string1 for maior que a string 2

Ignorando a Caixa ao Determinar se as Strings São Iguais

Algumas vezes você pode querer comparar duas strings sem considerar a caixa. Para comparar strings sem considerar a caixa, você pode criar a função strieql, como mostrado aqui:

								
#include <stdio.h>
int strieql(char *srt1, char *str2)
{
    while ((toupper(*str1) == toupper(*str2))&& (*str1))
    {
        str1++;
        str2++;
    }
    return((*str1 == NULL) && (*str2 ==NULL));
}

Como você pode ver, a função strieql converte cada caractere em cada string para maiúscula antes de comparar as duas strings. O programa a seguir, ilustra como usar strieql:

								
#include <stdio.h>
#include <Ctype.h>
void main(void)
{
    printf ("Testando Abc e Abc %d\n",strieql("Abc","Abc"));
    printf ("Testando abc e Abc %d\n",strieql("abc","Abc"));
    printf ("Testando abcd e abc %d\n",strieql("abcd", "abc"));
}

Quando você compilar e executar o programa sua tela exibirá o seguinte:

								
Testando Abc e Abc 1
Testando abc e Abc 1
Testando abcd e abc 0

Atenção: O compilador TCLite nao aceita a função strieql, portanto devemos substituí-la pela função stricmp. A função stricmp, retorna os seguintes valores:


< 0 se a string1 for menor que a string2
= 0 se a string1 for igual a string2
> 0 se a string1 for maior que a string 2

Convertendo uma String de Caracteres para Maiúsculas ou Minúsculas

								
#include <string.h>
char *strlwr(char *string);
char *strupr(char (string));

O programa a seguir, ilustra como usar as funções strlwr e strupr:

               
#include <stdio.h>
#include <string.h>
void main(void)
{
    printf (strlwr ("Bíblia do programador C/C++, do Jamsa!\n"));
    printf (strupr ("Bíblia do programador C/C++, do Jamsa!\n"));
}

Convertendo a Representação em String de Caracteres de um Número

Funções da biblioteca de execução que seus programas podem usar para converter representações ASCII de um valor numérico.

 

Função

Propósito

atof

Converte a representação de string de caracteres em um valor em ponto flutuante.

atoi

Converte a representação de string de caracteres em um valor inteiro.

atol

Converte a representação em string de caracteres em um valor inteiro longo.

strtod

Converte a representação de string de caracteres em um valor em precisão dupla.

strtol

Converte a representação de string de caracteres em um valor longo.

O programa a seguir, ilustra como usar as funções de ASCII para numérico:

								
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
   int int_result;
   float float_result;
   long long_result;
   int_result = atoi("1234");
   float_result = atof("12345.678");
   long_result = atol("1234567L");
   printf("%d %f %ld\n", int_result, float_result, long_result);
	 printf("%d %f %ld\n", int_result, float_result, long_result);
}

Encontrando um Caractere da Primeira Ocorrência de um Determinado Conjunto

Dependendo da função que seu programa executar, algumas vezes você irá querer pesquisar em uma string a primeira ocorrência de qualquer caractere de um dado conjunto de caracteres. Para lhe ajudar a procurar em uma string qualquer caractere de um conjunto, a maioria dos compiladores C fornece a função strspn, como mostrado aqui:

								
#include <string.h>
size_t strspn(const char *s1, const char *s2);

Dentro da string s1, a função retorna o deslocamento do primeiro caractere não contido dentro da string s2. O programa a seguir, ilustra como usar a função strspn:

								
#include <stdio.h>
#include <string.h>
void main(void)
{
   printf("Procurando Abc em Abcdef %d\n",strspn("AbcDef", "Abc"));
   printf("Procurando cbA em AbcDef %d\n",strspn("AbcDef", "cbA"));
   printf("Procurando Def em AbcAbc %d\n",strspn("AbcAbc", "Def"));
}

Quando você compilar e executar o programa sua tela exibirá o seguinte:

								
Procurando Abc em AbcDef 3
Procurando cbA em AbcDef 3
Procurando Def em AbcAbc 0

Localizando uma Substring Dentro de uma String

À medida que seus programas trabalharem com strings, algumas vezes você precisará procurar uma substring específica dentro de uma string. Para lhe ajudar a procurar uma substring em uma string, a maioria dos compiladores C fornece uma função chamada strstr, como mostrado aqui:

								
#include <stdio.h>
strstr(string, substring);

Se a substring existir dentro da string, strstr retornará um ponteiro para a primeira ocorrência da string. Se strstr não encontrar a substring, a função retornará NULL. O programa a seguir, ilustra como usar strstr:

								
#include <stdio.h>
#include <string.h>
void main(void)
{
   printf ("Procurando Abc em AbcDef %s\n",(strstr("AbcDef", 
	 "Abc"))"Encontrado" : "Não encontrado");
   printf ("Procurando Abc em abcDef %s\n", (strstr("abcDef", 
	 "Abc"))"Encontrado" : "Não encontrado");
   printf ("Procurando Abc em AbcAbc %s\n", (strstr("AbcAbc", 
	 "Abc"))"Encontrado" : "Não encontrado");
}

Para lhe ajudar a compreender melhor strstr, considere a seguinte implementação:

								
char *strstr(const char *s1, const char *s2)
{
   int i, j, k;
   for (i = 0; s1[i]; i++)
       for (j = i, k = 0; s1[j] == s2[k]; j++, k++)
           if (! S2[k+1])
              return (s1 + i);
   return(NULL);
}

Contando o Número de Ocorrências da Substring

Você viu como usar a função strstr para localizar uma substring dentro de uma string. Em certas ocasiões, você poderá querer saber o número de vezes que uma substring aparece dentro de uma string. A seguinte função strstr_cnt, permite-lhe determinar quantas vezes uma determinada substring ocorre dentro de uma string.

								
int strstr_cnt (const char *string, const char *substring)
{
   int i, j, k, conta = 0;
   for (i = 0; string[i]; i++)
       for (j = i, k - =0; string[j] == substring[k];j++, k++)
           if (! substring[k+1])
              conta++;
   return(conta);
}

Obtendo um Índice para uma Substring

Você aprendeu como usar a função strstr para obter um ponteiro para uma substring dentro de uma string. Se você tratar as strings de caracteres como matrizes, em vez de usar ponteiros, algumas vezes irá querer saber o índice do caractere onde uma substring inicia dentro da string. Usando o valor que strstr retorna, você pode subtrair o endereço da string para produzir um índice:

								
indice = strstr(string, substr) – string;

Se strstr não encontra a substring, o valor do índice será igual ao tamanho da string. Além disso, seus programas podem usar a função substring_index para obter um índice para uma substring, como mostrado aqui:

								
int substring_index (const char *s1, const char *s2)
{
    int i, j, k;
    for (i = 0; s1[i]; i++)
        for (j = i, k = 0; s1[j] == s2[k]; j++, k++)
            if (! S2[k+1])
               return(i);
    return(i);
}

Determinando se um Caracter é Alfanumérico

Um caractere alfanumérico é uma letra ou um dígito. Em outras palavras, um caracter alfanumérico é uma letra maiúscula de A até Z, uma letra minúscula de a até z, ou um dígito de 0 até 9. Para ajudar seus programas a determinar se um caractere é alfanumérico, o arquivo de cabeçalho ctype.h contém uma macro chamada isalnum. A macro examinará uma letra e retornará o valor 0 se o caractere não for alfanumérico, e um valor diferente de zero para caracteres alfanuméricos, como mostrado aqui:

								
if (isalnum(letra))

Para compreender melhor a macro isalnum, considere implementação:

								
#define isalnum(c) ((toupper((c)) >= ‘A’ && (toupper((c)) 
<= ‘Z’ || ((c) >= ‘0’ && ((c) <= ‘9’))

Determinando se um Caractere é uma Letra

Á medida que seus programas trabalharem com caracteres dentro de strings, algumas vezes precisarão testar se um caracter contém uma letra do alfabeto (maiúscula ou minúscula). Para ajudar seus programas a determinar se um caractere é uma letra do alfabeto, o arquivo de cabeçalho ctype.h fornece a macro isalpha. A macro uma letra e retorna o valor 0 se o caractere não contém uma letra maiúscula de A até Z ou minúscula de a até z. Se o caractere contém uma letra do alfabeto, então a macro retorna um valor diferente de zero:

								
if (isalpha (caractere))

Para compreender melhor a macro isalpha, considere a seguinte implementação:

								
#define isalpha(c) (toupper((c)) >= ‘A’&& (toupper((c)) <= ‘Z’)

Determinando se um Caractere é Maiúsculo ou Minúsculo

À medida que seus programas forem trabalhando com caracteres dentro de uma string, algumas vezes você precisará saber se um caractere é uma letra maiúscula ou minúscula. Para ajudar seus programas a testar a caixa das letras, o arquivo de cabeçalho ctype.h fornece as macros islower e isupper. Essas macros examinam um caractere e retornam um valor 0 para caracteres que não são minúsculos (islower) ou minúsculos (isupper) e um valor diferente de 0 em caso contrário:

								
if (islower (caractere))
if (isupper (caractere))

Para compreender melhor as macros islower e isupper, considere as seguintes implementações:

								
#define islower (c) ((c) >= ‘a’ && (c) <=’z’)
#define isupper (c) ((c) >= ‘A’ && (c) <= ‘Z’)

Determinando se um Caractere Contém Espaço em Branco

O termo caracteres de espaço em branco inclui os seguintes caracteres: espaço, tabulação, retorno do carro, nova linha, tabulação vertical e alimentação de formulário. Quando seus programas efetuam saída de caracteres, algumas vezes você precisa testar se um caractere contém um espaço em branco. Para ajudar seus programas a testar o espaço em branco, o arquivo de cabeçalho ctype.h fornece a macro isspace. Essa macro examina um caractere e retorna um valor diferente de 0 para caracteres e espaço em branco, e um valor 0 para caracteres de não espaço em branco:

								
if (isspace (caractere))

Para compreender melhor a macro isspace, considere a seguinte implementação:

								
#define isspace (c) (((c) == 32) || ((c) == 9) || ((c) == 13)