Utilizando ponteiros na manipulação de strings

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

[ Hits: 21.808 ]

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

Parte 7 (Pesquisa) - Sessão de estudo sobre MATRIZES.

Seu quarto programa em C

Par/ímpar em C

Algoritmo de ordenação: Selection Sort

Dividir figura em .pnm em fatias


  

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