Jump to content
PsySc0rpi0n

Função strlen () -- identificadores duplicados

Recommended Posts

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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 */
}

Edited by 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!

Share this post


Link to post
Share on other 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%.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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%.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.