Ir ao conteúdo

calcular o tamanho da string usando ponteiros


Cambalinho

Posts recomendados

Postado

#include <stdio.h>

int strlen(char *s)
{
char *ptr=s;//s=&s[0]
while (*s!='\0')
s++;
return (int) (s-ptr);
}

void main()
{
char Nome[]="Joaquim Miguel";


printf("O tamanho do nome: %d\n",strlen(Nome));
}

eu entendo a funçao strlen(), mas nao entendo o 'return'. alguem pode explicar?

Postado
eu entendo a funçao strlen(), mas nao entendo o 'return'. alguem pode explicar?

O que você não entendeu? O typecasting ou o cálculo?

LNW

Postado

Cambalinho,

Um ponteiro guarda um endereço de memória. s é um ponteiro. Imagine que esse endereço inicial seja 4000. ptr recebe esse endereço inicial. O valor de s é incrementado à medida que o caractere comparado atual seja diferente do terminador de string. Quando isso acontecer, s estará guardando o endereço 4014. Então, s - ptr = 14.

NW

Postado

Essa função retorna a diferença de bytes entre os dois ponteiros (s e ptr).

No while, a linha s++ é aritmética de ponteiros, isso quer dizer que s é incrementado pela quantidade de bytes. Se o tamanho de int é de 4 bytes, então s será incrementado em 4 a cada loop.

Postado
Cambalinho,

Um ponteiro guarda um endereço de memória. s é um ponteiro. Imagine que esse endereço inicial seja 4000. ptr recebe esse endereço inicial. O valor de s é incrementado à medida que o caractere comparado atual seja diferente do terminador de string. Quando isso acontecer, s estará guardando o endereço 4014. Então, s - ptr = 14.

NW

char Nome[]="hello";

se imaginar-mos que &Nome[0]=100

h e l l o

100 101 102 103 104

O ptr vai receber 100.

e como s é 1 ponteiro e é somado com o tamanho do tipo(char). ao chegar ao fim tem o valor 104. (como diz a matematica) 104 - 100 = 4 ou seja s-ptr.

certo?

(ou seja subtrairam os endereços)

(desculpa, mas nao consegui meter os caracteres ao mesmo nivel que os numeros)

Postado

Também dá para fazer assim


int strlen(char *texto){
char *ptr = texto;

while(*texto++ != '\0');

return (int)(texto - ptr - 1);
}

Com while sem instrução.

Postado
Também dá para fazer assim


int strlen(char *texto){
char *ptr = texto;

while(*texto++ != '\0');

return (int)(texto - ptr - 1);
}

Com while sem instrução.

usas-tes o '-1' porque no fim do ciclo ele vai somar '+1', certo?

Postado

Usando pré incremento dá para eliminar esse -1


int strlen(char *texto){
char *ptr = texto;

while(*++texto != '\0');

return (int)(texto - ptr);
}

Assim fica melhor

Postado
Acho melhor manter a versão anterior; teste com uma string vazia ("")

NW

Tem razão.

Com pré incremento acaba pulando o caractere \0 antes de testar a condição.

Postado
Tem razão.

Com pré incremento acaba pulando o caractere \0 antes de testar a condição.

por acaso pensei nisso;)

mas resolves isso a iniciar a variavel com '-1';)

Postado

Outra solução, de um loop sem instrução e sem - 1, é com FOR.

Em C++ é possível declarar e atribuir uma variável no próprio FOR.


int strlen(char *texto){

for(char *ptr = texto; *texto != '\0'; texto++);

return (int)(texto - ptr);
}

  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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