Utilizando ponteiros na manipulação de strings
Publicado por Diego Henrique Sampaio de Souza 17/01/2007
[ Hits: 22.119 ]
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 ^^.
gramquilo.c - Transforma grama em quilo
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Mint Xfce não mantém a conexão no wi-fi (2)
Problemas com Driver NVIDIA (5)
Warcraft II Remastered no Linux? (8)









