Utilizando ponteiros na manipulação de strings
Publicado por Diego Henrique Sampaio de Souza 17/01/2007
[ Hits: 21.790 ]
Homepage: https://diegosouza.dev
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!
//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 ^^.
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta