sábado, 5 de janeiro de 2013

Strings


O tipo de vetor (array) de formato comumente usado é o vetor de caracteres conhecido como string, como explicado no texto anterior, a linguagem C fornece suporte para declaração de vetores, entretanto como visto, os dados tem de possuir o mesmo tipo e um tamanho fixo em sua declaração, o que acaba criando algumas restrições para criar um tratamento genérico, ao comentar sobre vetores de tamanho variável e a implementação desejada, no primeiro exemplo, foi usado um cabeçalho com o tamanho da string, apesar da grande vantagem de iniciar o tratamento do vetor com o tamanho já estabelecido, a desvantagem veio pelo limite de oito bits do tipo char, limitando a informação da string para um máximo de 256 posições, sendo uma dela usada como cabeçalho, mesmo usando mais bytes para aumentar o tamanho da string, o problema do limite persiste e o cabeçalho passa a variar cada vez que os limites forem alcançados.

No segundo exemplo, temos o desenvolvimento que foi escolhido para ter suporte na linguagem, como se trata de uma cadeia de caracteres, a informação contida nos bytes segue o padrão ASCII, precisando somente de sete dos oito bits, o que permite ter uma série de bytes extras com características especiais, além de temos um grupo de valores de texto, inclui um delimitador de valor nulo (zero), apesar de ser necessário percorrer toda a string até encontrar seu fim para determinar o tamanho, foi eliminado a preocupação com o tamanho máximo estabelecido pelo uso de um cabeçalho.

Incluído o arquivo com código fonte, disponibilizando a execução deste pequeno conjunto da biblioteca de strings, observando que neste exemplo as rotinas estão declaradas em um único arquivo e usando em sua declaração de função letras maiúsculas para diferencia-las das suas versões equivalentes que já fazem parte da biblioteca integrada a linguagem C. Abaixo a listagem do que ira emular as funções mais conhecidas para tratar o vetor de caracteres.


Rotina
Descrição
Manipulação
StrCpy
Copia uma string em outra
StrCat
Junta uma string a outra
Verificação
StrLen
Retorna o tamanho da string
StrCmp
Compara duas strings
StrChr
Encontra a primeira ocorrência de um byte na string

Apesar de ter enumerado a vantagem de usar não precisar de um cabeçalho que utiliza um byte, word ou double word, as rotinas estão utilizado a variável int para acessar os vetores, que por si acaba limitando o tamanho pelo tipo que representa na maquina, optei por usar vetores ao invés de ponteiros, mantendo assim o foco do assunto em vetores.

#include <stdio.h>

char *StrCpy( char dest[], const char src[] );
char *StrCat( char dest[], const char src[] );
size_t StrLen( const char str[] );     
int StrCmp( const char lhs[], const char rhs[] );
char *StrChr( const char str[], int ch );
            

void main(void)
{
       char strDest[100];
       const char *strSrc = { "strcpy" };
       const char *strSrc2 = { "strcat" };

       StrCpy(strDest, strSrc);

       printf("%s\n", strDest);

       StrCat(strDest, strSrc2);

       printf("%s\n", strDest);

       printf("%i\n", StrLen(strDest));

       printf("%i\n", StrCmp(strSrc, strSrc2));
       printf("%i\n", StrCmp(strSrc2, strSrc));
       printf("%i\n", StrCmp(strSrc, strSrc));

       printf("%s\n", StrChr(strDest, 'a'));
}


char *StrCpy( char dest[], const char src[] )
{
       int i;

       // copy until NULL
       for (i = 0; src[i] != '\0'; i++)
             dest[i] = src[i];

       // include NULL to dest
       dest[i] = src[i];
      
       return dest;
}

char *StrCat(char dest[], const char src[])
{
       int i, j;

       // find end
       for (i = 0; dest[i] != '\0'; i++);

       // copy until NULL
       for (j = 0; src[j] != '\0'; i++, j++)
             dest[i] = src[j];

       // include NULL to dest
       dest[i] = src[j];
      
       return dest;
}

size_t StrLen( const char str[] )
{
       size_t s;

       // find end
       for (s = 0; str[s] != '\0'; s++);

       return s;
}

int StrCmp( const char lhs[], const char rhs[] )
{
       int i, j;

       // continue while equal
       for(i = 0; ((j = (lhs[i] - rhs[i])) == 0) && lhs[i] && rhs[i]; i++);


       return j;
}

char *StrChr( const char str[], int ch )
{
       int i;

       i = 0;

       // until ends
       while (str[i])
       {
             // or find
             if (str[i] == ch)
             {
                    return &str[i];
             }
             i++;
       }

       return NULL;
}




Nenhum comentário:

Postar um comentário