Utilizando ponteiros na manipulação de strings

Publicado por Diego Henrique Sampaio de Souza 17/01/2007

[ Hits: 21.790 ]

Homepage: https://diegosouza.dev

Download PonteiroStrings.c




Bom, para aqueles que querem entender ou que o professor não deixa utilizar a biblioteca string ou cstring, estou mandando um script com duas funções básicas.

Uma das funções do programa apenas conta o tamanho da string e a outra função compara se é a mesma ao contrário, logo mais estarei colocando scripts para a comparação de strings e concatenação de letras em strings.

Qualquer coisa, dúvidas e críticas, welfeu@gmail.com.

Falou galera!

  



Esconder código-fonte

//Criador: Diego Henrique Sampaio de Souza;
//Estudante do 2º período (passei agora to no 3º xD) de Sistemas de Informação na Universitas (Itajubá-MG);
//Estagiário na UNIFEI (Universidade Federal de Itajubá) no LABVIS (Laboratório de Visão Computacional);
//E-mail de Contato: welfeu@gmail.com  (para qualquer dúvida ou crítica ao código ^^.

/*
   Bom, a princípio espero que todos que pegarem este script tenham um conhecimento pelo menos básico quanto
   a passagem de parametros de função, neste caso apenas por referência.
*/

#include <stdio.h>

//Esta função irá receber o primeiro endereço do vetor string no *ponteiro e a partir daí iniciar a contagem
//por ser uma função contadora será do tipo int e irá retornar a quantidade contada.
int ContaString(char *ponteiro){

   int contador=0; //Esta variável contador será utilizada para contar o tamanho da string.


   //OBS: apesar de ser {FONTE} a condição que quebra o loop while não se confundam ao pensar que o
   //{FONTE} tem que estar entre aspas duplas pois ele é apenas um marcador e considerado como um caracter simples.

    while(*ponteiro!='{FONTE}'){

   //Para que no caso de um usuário talvez digite uma palavra com um espaço
   //teremos que tomar alguma providência quanto a isto certo? Então irei fazer um if aqui
   //caso ocorra este evento.

      if(*ponteiro!=' ')
          contador++;

   //Como o ponteiro recebeu o endereço da primeira posição do vetor string
   //ele irá percorrer os endereços do vetor um a um através do incremento abaixo.
      ponteiro++;
   }//Fim do while se ponteiro diferente de {FONTE}


   return contador; //Retornando o valor encontrado.
}//Fim da Função Conta String.


//Esta função irá comparar se a string digitada pelo usuário é igual ao contrário.
//Ela será do tipo bool (booleana <verdadeiro ou falso>).
//A principio irá começar igual, iremos receber por paramêtro a posição inicial do vetor na variável ponteiro.
bool ComparaString(char *ponteiro){
   //Declaração das variáveis, declarei mais um ponteiro para poder realizar a verificação, dois contadores que irei
   //explicar a função de cada um mais a frente e uma variável que irá ser retornada no fim da função do tipo bool.
   char *ponteiro2;
   int contador=0, contador2=0;
   bool condicao=false;

   ponteiro2=ponteiro; //Bom, aqui estou passando a posição que o *ponteiro recebeu da variável string
                       //para que a frente não seja perdida a posição inicial e eu não necessite construir um loop
                       //apenas para encontrar a posição inicial novamente.

   //Aqui estou realizando a contagem de quantos caracteres existem na string,
   //também poderia simplesmente utilizar a função ContaString aqui mas para deixar mais legível irei fazer esta comparação
   //novamente.
   while(*ponteiro!='{FONTE}'){

      if(*ponteiro!=' ')//Só irá incrementar o contador caso o ponteiro seja diferente de ' '<espaço>.
         contador++;

      ponteiro++;
   }//Fim do loop de While para o ponteiro diferente de {FONTE}.

   //Ao sair do loop observe que o ponteiro na verdade está apontado para a última posição (o {FONTE}) e como eu não possuo o {FONTE}
   //no inicio na palavra irei decrementar o ponteiro fazendo assim com que ele retorne ao último caracter

   ponteiro--;

   /*Exemplo:
      Caso eu Digite uma palavra qualquer como por exemplo bola.
      Na hora que em que o ponteiro tiver chegado ao caracter 'a' o próximo seria o {FONTE}
      Utilizando o vetor para exemplificar(imaginem estarem em um loop while como o de cima):
         string[0] = 'b'   *ponteiro, quando incrementar o ponteiro (ponteiro++) irá para a próxima posição no caso string[1]
         string[1] = 'o'   *ponteiro, (ponteiro++) incrementando novamente irá para string[2]
         string[2] = 'l'   *ponteiro, (ponteiro++) incrementando novamente irá para string[3]
         string[3] = 'a'   *ponteiro, (ponteiro++) incrementando novamente irá para string[4]
         string[4] = '{FONTE}'  *ponteiro

      Como vocês podem ver não o {FONTE} só existe no final da palavra e como eu não devo considerar ele para comparar se
      é ou não igual ao começo da palavra ao contrário eu decremento o ponteiro para que ele retorne a penúltima posição
      que seria o caracter 'a'. Entendido? Caso não deixe sua mensagem que tentarei ser mais claro.
   */

   //Como o ponteiro2 guardou a posição inicial do ponteiro então irei utilizar ele para fazer as comparações
   //Observe que aqui estou fazendo com que o ponteiro2 vá até o {FONTE} mas talvez você se pergunte o porque de não utilizar
   //o ponteiro que está no final e ir até a primeira variável não é mesmo? Bom você até pode fazer isto mas o incoveniente
   //seria que você iria necessitar de criar mais uma variável do tipo char que guardasse a primeira posição do vetor
   //pois como vocês podem ver dentro do while os ponteiros (tanto o ponteiro como ponteiro2) estão em movimento.
   while(*ponteiro2!='{FONTE}'){
      if(*ponteiro2==*ponteiro)//Caso os dois Ponteiros estejam apontado para variáveis e estas sejam iguais, ela entra na próxima condição.
         if(*ponteiro!=' ')//Sem esta condição o contador2 seria incrementado mesmo que houvesse espaços e como nos previnimos que lá em cima não conte os espaços aqui também devemos fazer isso.
            contador2++;
      ponteiro--;
      ponteiro2++;
   }

   //Bom, se os dois contadores forem iguais a variável condição receberá o valor true e depois será retornada, caso não seja
   //simplesmente será retornada com o valor false que foi atribuída a ela no começo da função
   if(contador==contador2)
      condicao=true;

   return condicao;
}//Fim da função ComparaString


void main(void){

char string[100];
int tamanho;
bool condicao;

   printf("\nDigite uma palavra: ");
   gets(string);

   //A variável tamanho irá receber o valor retornado pela função ContaString que é do tipo inteiro.
   tamanho=ContaString(string);

   printf("\nO tamanho da palavra digitada eh %d",tamanho);

   //Aqui iremos atribuir a variavel condição, que é do tipo bool, o retorno da função ComparaString.
   condicao=ComparaString(string);

   //Se for condicao (no caso se condicao == true) ele irá exibir a primeira mensagem se não a segunda mensagem.
   if(condicao)
      printf("\n\nA palavra digitada eh a mesma ao contrario!!");

   else
      printf("\n\nA palavra digitada nao eh a mesma ao contrario!!");

}


//OBS: Como a maior parte de vocês, que procura conhecer um pouco mais da programação, sou apenas um estudante que gosta de programação, este seria o meu modo de realizar estas tarefas
//sem a utilização das bibliotecas string e cstring, deve existir melhores métodos mas a título de aprendizado acho que
//por enquanto está bom ^^. Falou galera e obrigado por lerem este script(o meu 1º aqui na VOL), qualquer dúvida ou crítica, comentando aí galera ^^.

Scripts recomendados

Conversor de Euros em Reais

Gerando Matriz aleatoriamente

Manipulação de BITS em C

Crivo de Eratóstenes

Árvores Binárias em C


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts