Ir ao conteúdo
  • Cadastre-se
Celestino Alona

C Contagem de caracteres com Ponteiros

Recommended Posts

Bom dia. Estava fazendo meu estudo sobre ponteiros em C e me deparei com um código para contagem de caracteres numa string. Entretanto, eu tentei refazer o código, porém sem usar função, fazendo todo o processo na main. Abaixo o programa "original" porém com algumas alterações e comentários que eu fiz, pra conseguir entender melhor. Eu entendi o código, porém queria saber o por que de não estar funcionando fora de uma função.

 

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

void contagem(char *name); /* Protótipo da função */

main()
{
	setlocale(LC_ALL,"portuguese");
	 
	 char name[100];
	 char *ptr = name;
	 
	 char *search_char = &name[6]; /* Quando for escolher a posição do vetor, lembrar de colocar o '&'*/
	 
	 int size=0;
	 
	 printf("Insira seu nome : ");
	// fgets(name, 100, stdin); --> fgets adiciona uma unidade ao endereço, não sei ao certo se é isso, mas a contagem fica com 1 a mais 
	 gets(name);
	 
	contagem(name);  
	
	printf("\n*Search_char = %c\n\nSearch_char = %d\n",*search_char, search_char); /* Criei search_char para confirmar se cada */
	                                                                               /* número correspondia a um caractere. */
	
	*search_char='z'; /* Como o ponteiro search_char tem como endereço a posição 7 do vetor name, alterando o *search_char (que controla o conteúdo 
	dessa posição do vetor) para recebendo o caractere 'z' é como dizer que a posição 7 do vetor irá receber 7*/
	
	search_char = &name[2]; /* Agora ele aponta para a posição 2 do vetor name */
   *search_char = 'l';      /* Portanto, *search_char agora irá controlar o conteúdo da mesma, colocando um 'l' na posição 2 do vetor name*/
	
	
	search_char = name;     /* Agora ele aponta para a posição 0 do vetor name */
   *search_char = '2';      /* Portanto, *search_char agora irá controlar o conteúdo da mesma, colocando um '2' na posição 0 do vetor name.*/
	
	
	printf("\n%s\n\n", name);
	
	size = sizeof(char);
	
	printf("Número de bytes do tipo char --> %d",size);
	
	return 0;
}


void contagem(char *name)
{
	char *ptr = name;
	
	while(*name!='\0')
	{
		printf("Valor de name no while --> %d\n----------------------\n",name);
		
		/* O incremento funciona para fazer a contagem de caracteres, pois o tipo char possui 1 byte, então a conta fica exata */
		/* Cada número impresso corresponde ao endereço de um caractere do vetor "name" */

		name++;
	}
	
	printf("ptr - name = número de caracteres inseridos no nome : %d\n\n", (name)-ptr);	
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Celestino Alona Olá. Dei uma olhada no código só q estou em dúvida se você quer imprimir o endereço de memória do tipo char no while ou o seu valor na tabela ASCII. Coloquei o valor de na tabela ASCII

Vê se ajuda:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

void contagem(char *name); /* Protótipo da função */

int main()
{
    setlocale(LC_ALL,"portuguese");

    char name[100];
    char *ptr = name;
    char ch;

    char *search_char = &name[6]; /* Quando for escolher a posição do vetor, lembrar de colocar o '&'*/

    int size=0;

    printf("Insira seu nome : ");
    fgets(name, 100, stdin); 
    strtok(name, "\n");
    if (strlen(name) == 100 - 1) {
        while ((ch = getchar()) != '\n' && ch != EOF);
    }
    //gets(name); // OBS: Não recomendo usar o gets!!! Esse comando é considerado "perigoso"

    printf("\n");

    contagem(name);

    printf("\n*Search_char = %c\n\nSearch_char = %d\n", *search_char, *search_char); /* Criei search_char para confirmar se cada */
    /* número correspondia a um caractere. */

    search_char = &name[7];
    *search_char = 'z'; /* Como o ponteiro search_char tem como endereço a posição 7 do vetor name, alterando o *search_char (que controla o conteúdo
	dessa posição do vetor) para recebendo o caractere 'z' é como dizer que a posição 7 do vetor irá receber 7*/

    search_char = &name[2]; /* Agora ele aponta para a posição 2 do vetor name */
    *search_char = '5';      /* Portanto, *search_char agora irá controlar o conteúdo da mesma, colocando um 'l' na posição 2 do vetor name*/


    search_char = name;     /* Agora ele aponta para a posição 0 do vetor name */
    *search_char = '2';      /* Portanto, *search_char agora irá controlar o conteúdo da mesma, colocando um '2' na posição 0 do vetor name.*/


    printf("\n%s\n\n", name);

    size = sizeof(char);

    printf("Número de bytes do tipo char --> %d\n\n", size);

    return 0;
}


void contagem(char *name)
{
    char *ptr = name;

    while(*name!='\0')
    {
        printf("Valor de name no while --> %d\n----------------------\n", *name);

        /* O incremento funciona para fazer a contagem de caracteres, pois o tipo char possui 1 byte, então a conta fica exata */
        /* Cada número impresso corresponde ao endereço de um caractere do vetor "name" */

        name++;
    }

    printf("\nptr - name = número de caracteres inseridos no nome : %d\n\n", (name) - ptr);
}

Vê se é isso q você quer

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Foca só na função mesmo. Eu queria saber se da pra fazer aquele processo de contagem de caracteres na main. Por que eu tentei passar o processo da função pra main e deu erro. Tem alguns comentários e ponteiros que não fazem muito sentido, mas é por que eu tava alterando o código e fazendo "experimentos" pra entender como ele funcionava, porém eu não mexi na função que faz a contagem de caracteres inseridos na string. Resumindo, é pra aparecer na tela a quantidade de caracteres inseridos na string digitada pelo usuário. As informações que aparecem além disso são, como eu disse, "experimentos" que eu fiz pra entender melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Celestino Alona No main a string name não é ponteiro. Mas com alocação dinâmica d memória dá para fazer de name um ponteiro

Tente isso amigo:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>


int main()
{
    setlocale(LC_ALL,"portuguese");

    char *name = NULL;
    char *ptr = NULL;
    char ch;
    int i;

    name = malloc(100 * sizeof(char));

    printf("Insira seu nome : ");
    fgets(name, 100, stdin);
    strtok(name, "\n");
    if (strlen(name) == 100 - 1) {
        while ((ch = getchar()) != '\n' && ch != EOF);
    }

    printf("\n");

    ptr = name;

    while (*name != '\0') {

        printf("Valor de name no while --> %d\n----------------------\n", *name);

        name++;

    }

    printf("\nptr - name = número de caracteres inseridos no nome : %d\n\n", (name - ptr));

    printf("Nome: %s\n\n", ptr);

    free(name);

    ptr = NULL;
    name = NULL;

    return 0;
}

Aritmética d ponteiros

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×