Gurzi Posted May 8, 2006 at 08:44 PM Report #26451 Posted May 8, 2006 at 08:44 PM 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(); } 😁
brink@ero Posted May 8, 2006 at 09:15 PM Report #26471 Posted May 8, 2006 at 09:15 PM 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:
Gurzi Posted May 8, 2006 at 09:18 PM Author Report #26472 Posted May 8, 2006 at 09:18 PM ups, faltava me o *ptr =s ; esse compilador detecta tudo, o meu não disse nada weird :\
brink@ero Posted May 8, 2006 at 09:24 PM Report #26478 Posted May 8, 2006 at 09:24 PM 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 ? só com o emacs à frente. (sim eu uso o emacs :fartnew2:) cumpr. brink@ero
Gurzi Posted May 8, 2006 at 09:47 PM Author Report #26487 Posted May 8, 2006 at 09:47 PM 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
brink@ero Posted May 8, 2006 at 10:08 PM Report #26503 Posted May 8, 2006 at 10:08 PM 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 ?
Gurzi Posted May 8, 2006 at 10:27 PM Author Report #26510 Posted May 8, 2006 at 10:27 PM 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'?
Warrior Posted May 9, 2006 at 06:55 PM Report #26632 Posted May 9, 2006 at 06:55 PM Só um aparte, Gurzi, acho que usas o Dev-C++, vai a Tools, Compiler options, "Add the following commands when calling the compiler" -Wall
Gurzi Posted May 9, 2006 at 07:16 PM Author Report #26641 Posted May 9, 2006 at 07:16 PM obrigado warrior, mas que faz isso ?
brink@ero Posted May 9, 2006 at 10:36 PM Report #26698 Posted May 9, 2006 at 10:36 PM obrigado warrior, mas que faz isso ? Faz com que apareçam os warnings Cumpr. brink@ero :smoke:
Warrior Posted May 11, 2006 at 07:27 PM Report #26930 Posted May 11, 2006 at 07:27 PM 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.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now