Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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

Postado

@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.

Postado

@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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!