navrat

Programovacie jazyky, rady, poradňa...
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

navrat

Príspevok od používateľa miki11 »

mam napisany takyto program a ked nacitam napr jana do pom1 a fero do pom2, tak mi potom vypise ako a aj b fero. Co tam je zle?

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>

typedef  char *navrat;

navrat vycistit(char str[])
{
 char z[80];
 int i,j=0;

 for(i=0;i<strlen(str);i++)
 if(isalpha(str[i]))
   {
    z[j]=str[i];
    j++;
    }
    z[j]='\0';

 return z;
}

main()
{
  char *a,*b,pom1[80],pom2[80];

clrscr();

 a=(char *)malloc(80);
 b=(char *)malloc(80);

 gets(pom1);
 gets(pom2);

 a=vycistit(pom1);
 
 b=vycistit(pom2); 

 printf(" %s \n %s ",a,b);


getch();
}
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ty najskôr alokuješ pamäť pre premenné [a] a a potom v tej funkcii vycistit použiješ buffer na zásobníku a ten vrátiš (a pri ďalšom volaní ho trochu zo šťastím prepisuješ).

Alloc z main vyhoď, použi ho v tej funkcii (teda niečo ako z =malloc(strlen(str) + 1); ).

PS: Reťazec sa zvykne predávať ako char *str a nie ako char str[].
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Hej, dynamicke premenne sa vytvaraju v heape, lokalne premenne podprogamov v zasobniku(stacku) a neexistuju mimo tohto podprogamu(respektive pouziju sa pri volani inych podprogramov). Preto ked funkcia vracia adresu(pointer), nikdy nevracaj adresu lokalnej premennej. ;)
Napísať odpoveď