» »

strcpy reče segmatation fault

strcpy reče segmatation fault

MasterMind ::

V redu, problem se nahaja v tej funkciji.

void vpis()
{
  do
  {
    st++;
    dijaki=(struct oseba*) realloc(dijaki, st * sizeof(struct oseba));
    system("clear");
    printf("Vpišite ime dijaka: ");
    gets(temp);
    temp2=strlen(temp);
    dijaki[st-1].ime=(char*) malloc(temp2 * sizeof(char));
    strcpy(dijaki[st-1].ime,temp);
    printf("Vpišite priimek dijaka: ");
    gets(temp);
    temp2=strlen(temp);
    dijaki[st-1].priimek=(char*) malloc(temp2 * sizeof(char));
    strcpy(dijaki[st-1].priimek,temp);
    printf("Vpišite hišno številko dijaka: ");
    gets(temp);
    temp2=strlen(temp);
    dijaki[st-1].naslov_dijaka.hisna_stevilka=(char*) malloc(temp2 * sizeof(char));
    strcpy(dijaki[st-1].naslov_dijaka.hisna_stevilka,temp);
    printf("Vpišite poštno številko dijaka: ");
    gets(temp);
    temp2=strlen(temp);
    dijaki[st-1].naslov_dijaka.postna_stevilka=(char*) malloc(temp2 * sizeof(char));
    strcpy(dijaki[st-1].naslov_dijaka.postna_stevilka,temp);
    
    printf("\nImate še kakšnega dijaka za vpisati?(D/N) ");
    temp[0]=getchar();
    getchar();
    if((temp[0]=='d') || (temp[0]=='D'))
    {
      izbira=1;
    }
    else
    {
      izbira=0;
    }
  }while(izbira==1);
  shrani2=0;
}


(Upam, da nisem preveč zapounu posta :D)

Ko vnašam "dijake", mi 1. vpiše brez napak, ko grem pa dodat še enega, mi pa štekne pri vpisovanju poštne številke drugega dijaka. In ko sem šel delat debug, mi je pri vrstici strcpy(dijaki[st-1].naslov_dijaka.postna_stevilka,temp); javi segmatation fault. Bi mogoče vedeli kje bi lahko bila napaka?

Hvala vnaprej...
Gentoo, KDE uporabnik.
  • spremenilo: CCfly ()

CCfly ::

#include <string.h>

char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);


Začni uporabljati strncpy, ker si očitno nekje prekopiral predolg niz.
Lahko bi prilepil definicjo struct oseba.
"My goodness, we forgot generics!" -- Danny Kalev

MasterMind ::

Hmm... Niz ni predolg, ker so si glede dolžine približno enaki.

struct oseba
{
  char *ime;
  char *priimek;
  struct naslov naslov_dijaka;
  struct ocene ocene_dijaka;
}*dijaki;


Če hočš strukturo še drugih ti dam še druga dva... (+1 :D)
Gentoo, KDE uporabnik.

Zgodovina sprememb…

  • spremenilo: CCfly ()

Zvedavec ::

Po moje kopiraš na kazalec, ki ti kaže nekam v prazno, namesto da bi imel narejeno tabelo tipa char. Če pa hočeš imeti v strukturi kazalce, boš moral pa dodati kakšen malloc.

MasterMind ::

Mal poglej.. Jaz imam malloc kulker hočeš :D. Sem poskusil z strncpy() funkcijo in je delal. Ampak je ratal drug problem. Če je string krajši od najdalšega stringa, vpiše notr tut tisto grdobijo. temp spremenljivka je polje 100 znakov tipa char (char temp[100]) in mislim, da moram to počistit... Kako se to počisti? Tako, da nardim strcpy(temp," ");? al pa strcpy(temp,NULL);. Bom kar oba načina poskusil :D

POPRAVEK: Noben ne dela, in sem ugotovil zakaj ne dela. Problem je v spremenljivki temp, ker se enkrat zafila do konca. (je toliko stringov, da preseže 100 znakov). Treba je samo ugotovit, kako naj to sprostim, če ne bo šlo, bom kar uporabil pointer in bo :D
Gentoo, KDE uporabnik.

Zgodovina sprememb…

CCfly ::

Na koliko si nastavil st na začetku ?

- uporabljaj funkcijo calloc namesto malloc
- ko definiraš podatkovne strukture uporabi typedef
- tvoja definicija strukture in tistega kazalca dijaki sta mi malo sumljiva.
- poglej si podatkovno strukturo linearni seznam

typedef struct strOseba
{
  char *ime;
  char *priimek;
  struct naslov naslov_dijaka;
  struct ocene ocene_dijaka;
} oseba;

....

oseba **dijaki;


Za začetek nekako takole (ampak resno si poglej linearni seznam).
"My goodness, we forgot generics!" -- Danny Kalev

Zgodovina sprememb…

  • spremenilo: CCfly ()

Gundolf ::

To ti je kazen, ker ne uporabljaš C++ ;)

No resno, če se ti temp zafila pa jo nastavi na večjo številko, npr 1000000 (saj menda ti ne primankuje RAMa?:D )

MasterMind ::

Hvala CCfly. Sem naredil kakor si ti rekel, in je delalo. Najprej sem pa mogel še strcpy zamenat s strncpy :D. (pri pouku smo glih vzeli strukture, pa sem šel malo programirat s strukturam :D).
Gentoo, KDE uporabnik.

MasterMind ::

V šoli se učimo C. Zato pišem v C-ju. In sploh ni problem v temp-u :D. (nasledn let bom pa pisal v C++ ;))

Aja. KAkšna je sploh bistvena razlika med calloc in malloc? Razen te, da ga malo drugače kličeš :D
Gentoo, KDE uporabnik.

Zgodovina sprememb…

Gundolf ::

Aja. KAkšna je sploh bistvena razlika med calloc in malloc? Razen te, da ga malo drugače kličeš?


Si že sam ugotovil vso razliko.

MasterMind ::

Približno sem :D. Zaenkrat ni bistvenih teških problemov. Ko bom padel na kakšnega, bom kar v to temo napisal... Hvala za pomoč...
Gentoo, KDE uporabnik.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] strukture, kazalci in točen datum/čas

Oddelek: Programiranje
6696 (564) aceton
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
657318 (6391) MrBrdo
»

C strukture, kazalci naloga pomoc

Oddelek: Programiranje
51461 (1356) DavidJ
»

[C] problem s kazalci

Oddelek: Programiranje
141333 (1094) BigWhale
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71856 (1745) Jebiveter

Več podobnih tem