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