Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

JoaoSkate

[Dúvida] Definir funçao semelhante strlen, mas com ponteiros

Mensagens Recomendadas

JoaoSkate

Olá boa noite,

Estou aqui com um problema em definir a "minha própria " strlen , usando ponteiros, o código até compila mas depois dá-me segmentation fault, se alguem me puder dar uma ajuda a descobrir o meu problema, agradecia.

#include <stdio.h>
#include <string.h>
int strlen_ponteiros(char *v);    /*<----- prototipo da funcao*/

int main()
{
char *palavra=NULL;   /*como nao sei o tamanho certo da palavra que vai ser introduzida, crio um vetor com 100 posiçoes*/

printf("Introduza uma palavra:");
scanf("%s",palavra);

printf("Tamanho da string usando strlen_indices: %d\n",strlen_ponteiros(palavra));
printf("Tamanho da string usando strlen: %d\n",(int) strlen(palavra));  /* teste para ver se dá igual*/

return 0;

/*nota: strlen nao conta com o '\0'*/
}

int strlen_ponteiros(char *v){   /*<------funcao*/
int i;
char *ptr=v;
for(i=0 ; *(ptr+i)!='\0' ; i++);  

return i;
}

Editado por JoaoSkate

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
paulolz

Olá, JoãoSkate!

O erro é porque você declarou um ponteiro para char e não alocou memoria para ele. Para resolver você deve apontar o ponteiro chamado palavra para um vetor de char estático ou alocar memoria com malloc

A solução seria mais ou menos assim oh

1) Declarar um vetor de char

char vetorChr[200], *palavra;

palavra = vetorChr; // agora o ponteiro palavra tá apontando para o vetor de char

2) Alocar memoria

char *palavra = malloc(sizeof(char) *200);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JoaoSkate

Olá, JoãoSkate!

O erro é porque você declarou um ponteiro para char e não alocou memoria para ele. Para resolver você deve apontar o ponteiro chamado palavra para um vetor de char estático ou alocar memoria com malloc

A solução seria mais ou menos assim oh

1) Declarar um vetor de char

char vetorChr[200], *palavra;

palavra = vetorChr; // agora o ponteiro palavra tá apontando para o vetor de char

2) Alocar memoria

char *palavra = malloc(sizeof(char) *200);

Obrigado, pela ajuda, entretanto resolvi da seguinte forma e está a funcionar:

#include <stdio.h>
#include <string.h>
int strlen_ponteiros(char *v);

int main()
{
char palavra[100];

printf("Introduza uma palavra:");
scanf("%s",palavra);

char *ptr_palavra=palavra;

printf("Tamanho da string \"%s\" usando strlen_ponteiros: %d\n",palavra,strlen_ponteiros(ptr_palavra));
printf("Tamanho da string \"%s\" usando strlen: %d\n",palavra,(int) strlen(palavra));  /* teste para ver se dá igual*/

return 0;

/*nota: strlen nao conta com o '\0'*/
}
int strlen_ponteiros(char *v){
int i;

for(i=0 ; *(v+i)!='\0' ; i++);	 /* *(v+i) : conteudo da primeira posiçao do "vetor" v mais 'i' saltos*/

return i;
}

no entanto ainda vou entar usar o malloc, para nao estar a utilizar memoria desnecessariamente. Obrigado pela dica

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

duas coisas:

- a leitura de uma string para um buffer deverá sempre considerar o tamanho desse buffer:

char palavra[100];
scanf("%99s", palavra);

- usar o malloc não te resolverá o "uso de memória desnecessária". para perceber porquê, pensa : sabes quanta memória necessitas de reservar antes de pedir a palavra ?

ps : a tua função poderia ser optimizada

Editado por HappyHippyHippo
  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.