• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

Concatenar Strings

11 mensagens neste tópico

Bem isto estáme a dar um erro de memória porque ele compila mas quando entro os dois inputs aparece logo erro do windows a dizer que a Aplicação vai ter que encerrar..

alguem com bom olho por favor?

#include <stdio.h>
#include <stdlib.h>

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

char *strcopy(char *dest,char *orig)
{
  char *ptr=dest;
  while (*dest++=*orig++)
  ;
  return ptr;
}

char *strcat(char *dest,char *orig)
{
strcopy(dest+strlen(dest),orig);
return dest;
}

main()
{
  char orig[40];
  char dest[30];
  
  printf("Introduza o Seu nickname \n");
  gets(dest);
  printf("Introduza o Seu Clan \n");
  gets(orig);
  printf("A Sua tag será : %s",strcat(dest,orig));
  getchar();
}

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que é isto:

warning C4700: local variable 'ptr' used without having been initialized

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

Cumpr. brink@ero  :smoke:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ups, faltava me o *ptr =s ;

esse compilador detecta tudo, o meu não disse nada weird :\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ups, faltava me o *ptr =s ;

esse compilador detecta tudo, o meu não disse nada weird :\

Bem, eu usei o VC++, é o que tenho aqui.

Com ele vi os warnings e depois de executar passo-a-passo vi que crashou nesse mesmo sítio.

Mas com o gcc, se colocares -Wall, ele devia-se queixar.

Agora executar passo-a-passo, já não me lembro  :hmm: só com o emacs à frente. (sim eu uso o emacs  :fartnew2:)

cumpr. brink@ero

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

brinkaero surgiume aqui uma dúvida que me está a confundir a cabeça...

char *strcat(char *dest,char *orig)

{

strcopy(dest+strlen(dest),orig);

return dest;

}

imagina dest=tiago , orig = ola

aqui ele vai passar para strcopy o '\0' de tiago ou seja no strcopy vai receber o '\0' de tiago

char *strcopy(char *dest,char *orig)

{

  char *ptr=dest;

  while (*dest++=*orig++)

  ;

  return ptr;

}

aqui o ptr vai ser igual á posiçao de memoria de '\0' de tiago..

depois é feita a atribuiçao dali para a frente...

se ptr está a apontar para '\0' como é que o output final é de tiagoola ?

nao entendo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

brinkaero surgiume aqui uma dúvida que me está a confundir a cabeça...

char *strcat(char *dest,char *orig)

{

strcopy(dest+strlen(dest),orig);

return dest;

}

imagina dest=tiago , orig = ola

aqui ele vai passar para strcopy o '\0' de tiago ou seja no strcopy vai receber o '\0' de tiago

char *strcopy(char *dest,char *orig)

{

  char *ptr=dest;

  while (*dest++=*orig++)

  ;

  return ptr;

}

aqui o ptr vai ser igual á posiçao de memoria de '\0' de tiago..

depois é feita a atribuiçao dali para a frente...

se ptr está a apontar para '\0' como é que o output final é de tiagoola ?

nao entendo

Muito simples, como disseste o ptr está a apontar para '\0' e depois é feita a atribuiçao dali para a frente...

Assim a partir do '\0' tu escreves ola. O o ocupa a posição do '\0', o l a seguinte e o a a posição a seguir.

O return ptr devolve a string "ola" que não utilizas para nada na função strcat.

Esta por sua vez devolve o apontador dest. Este apontador está a apontar para o "t" do tiago, e quando fazes o printf, o compilador imprime todos os char até encontrar o '\0'.

Como substituíste o '\0' que se encontrava no fim da palavra tiago pela palavra "ola" + '\0', o output é tiagoola!

Espero ter exclarecido, cumpr. brink@ero :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tipo mas quando da funçao strcat passa para o str copy o dest leva o dest+strlen(dest) ou seja o parametro de rececpao de dest na funcao strcat n vai ser o '\0' de tiago ?

como é que o dest vai retornar tiago se vai para la em '\0'?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só um aparte, Gurzi, acho que usas o Dev-C++, vai a Tools, Compiler options, "Add the following commands when calling the compiler" -Wall

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado warrior, mas que faz isso ?

Faz com que apareçam os warnings

Cumpr. brink@ero  :smoke:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sem -Wall, um exemplo típico, se declarares uma variável que não uses, nada acontece, com -Wall, ele imite um Warning.

O programa corre, mas és avisado do facto.  (programação incorrecta)

Existem mais exemplos, este é o mais básico e todos compreendem.

0

Partilhar esta mensagem


Link 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