Ir para o conteúdo
PsySc0rpi0n

Função strlen () -- identificadores duplicados

Mensagens Recomendadas

PsySc0rpi0n

Bem, estou ali de volta de um exemplo do Damas e não estou a entender uma coisa. O code é este:

#include <stdio.h>
#define MAX 100
int strlen (char *str );
int main (void){
  char str [MAX];
  char *ptr = str;
  printf ("Introduza uma string: \n");
  gets (str);
  printf ("%d", strlen (str));

getchar ();
return 0;
}
int strlen (char *str) {
  char *ptr = str;
  while (*str != '\0')
  str++;
  return (int) (str - ptr);
}

Na função strlen está uma linha de código que já foi repetida na função main...

char *ptr = str;

Porque é que esta linha de código aparece novamente na função strlen???


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O ptr da função main() e o ptr da função strlen() são objectos distintos (com o mesmo identificador).

O ptr da função main() só existe na função main(). "Nasce" e "morre" uma vez.

De cada vaz que chamas a função strlen() nasce outro objecto com o nome ptr que não tem relação nenhuma com o da função main(). Esse objecto só existe dentro da função strlen(). "Nasce" e "morre" tantas vezes quantas chamares a função.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Então se eu quiser usar nomes diferentes, como teria que alterar o code (para tentar visualizar o que explicaste)?


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Por exemplo, assim

#include <stdio.h>

#define MAX 100

int strlen(char *str); /* NOTA: strlen é um identificador definido pela
                      ** linguagem, no header <string.h>
                      ** nao convem usa-lo para evitar conflitos */ 

int main (void) {
  char str[MAX];
  char *ptr = str;
  printf("Introduza uma string:\n");
  gets(str);          /* NOTA: gets() é uma função perigosa e que
                      ** deixou de existir em C no final do ano passado.
                      ** Para já fica a saber que há alternativas mais
                      ** seguras, mas ligeiramente mais trabalhosas */
  printf("%d", strlen(str));

  getchar ();
  return 0;
}

int strlen(char *str_dois) {
  char *ptr_dois = str_dois;
  while (*str_dois != '\0')
         str_dois++;
  return (int) (str_dois - ptr_dois); /* NOTA: o cast é desnecessário;
                                      ** como a funcao devolve int
                                      ** a conversao é feita automaticamente */
}

Editado por pmg
NOTAS

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

BTW:

Não uses o gets() é uma das piores funções do API do C! É impossível evitar overflow com ela. Usa fgets() ou qq outra que te permita limitar o input.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Então a declaração do ponteiro *ptr na função main é inútil, não?

BTW:

Não uses o gets() é uma das piores funções do API do C! É impossível evitar overflow com ela. Usa fgets() ou qq outra que te permita limitar o input.

Obrigado pelo advice mas os meus conhecimentos ainda não me permitem entender bem o que me disseste. Não sei o que é o overflow nem sei usar o fgets ainda...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Então a declaração do ponteiro *ptr na função main é inútil, não?

Muito bem visto. É completamente inutil :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Muito bem visto. É completamente inutil :)

Ok, assim já percebo...

O Damas aqui foi cromo... Só me confundiu...

Até porque eu costumo usar os mesmos nomes para ponteiros fora e dentro da função main para não me perder... Mas ali essa declaração na main é que acho que me confundiu...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Este é do manual de C++ mas usa-se exatamente da mm maneira:

http://www.cplusplus.com/reference/cstdio/fgets/


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg
assim já percebo... [o uso duma coisa inútil] só me confundiu...

Como dizia o Einstein (??): "Everything should be made as simple as possible, but not simpler".

O código acima pode-se simplificar (removendo a primeira definição de ptr, dentro da função main()) sem ser em demasia.

Isto é um bom objectivo a seguir, mas não é fácil de atingi-lo com regularidade.

Em muitos códigos de C espalhados pela 'net há muitas coisas que se podem tirar sem alterar a funcionalidade.

Em alguns códigos há coisas que faltam (simplificação demasiado grande).

Obter a simplificação máxima sem perder qualidades é uma arte :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

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.