Kezdőoldal » Számítástechnika » Programozás » Mi a hiba ebben a C kódban?

Mi a hiba ebben a C kódban?

Figyelt kérdés

Helló!


Feladat a leggyorsabb nevét kiírni.

-------

Az a gond, hogy a jó számmal tér vissza, de az utolsó versenyző nevével. Ha az IF ágon belül kiíratom a "legjobb" mutatót, akkor minden oké, IF ágon kívül meg beleírja az összes nevet és emiatt az utolsó nevet írja fájlba a megfelelő szám mellé - de nem értem, hogyan? Mert nem adtam rá utasítást.



2016. máj. 16. 08:40
 1/5 A kérdező kommentje:

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<string.h>

#include<ctype.h>

/*

Sanyi;Bahamák;43.10

Béla;USA;45.23

Feri;Kína;44.53

*/


typedef struct {

char nev[30];

char orszag[40];

double pontszam;

}AUTO;


AUTO *olvas(int *count){

char sor[100];

AUTO a;

double min = 100;

char *legjobb;

*count =0;

AUTO *fej = NULL;

AUTO *aktualis = NULL;

FILE* f_in = fopen("be9.txt", "rt");

FILE* f_out = fopen("ki9.txt", "wt");


while( fgets( sor, 99, f_in) ){


strcpy(a.nev, strtok(sor,";"));

strcpy(a.orszag, strtok(NULL,";"));

a.pontszam = atof(strtok(NULL,"\n"));


if(min > a.pontszam ){

min = a.pontszam;

legjobb = a.nev;

}


(*count)++;


fej = (AUTO*) realloc(fej,*count * sizeof(AUTO));

fej[*count-1]=a;


}

fprintf( f_out, "pontszam: %.2lf, neve: %s \n", min, legjobb);


return fej;


fclose(f_in);

fclose(f_out);

}


int main(){

unsigned int count;

olvas( &count );

return 0;

}

2016. máj. 16. 08:41
 2/5 SimkoL ***** válasza:

...

char legjobb[30];

...

if(min > a.pontszam ){

min = a.pontszam;

strcpy(legjobb, a.nev);

}

...


A legjobb-nak nem foglaltál memóriát, értelemszerűen lehet a név méretével megegyező.

2016. máj. 16. 10:51
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:

A "legjobb" egy pointer ami mindig az "a.nev"-re mutat, és mivel az "a" struktura helye a memóriában soha sem változik, mindig ugyan oda fog mutatni. Bármit is másolsz az "a.nev"-be az strcpy függvénnyel, arra fog mutatni a "legjobb" mutató. A "legjobb = a.nev;" sor nem csinál semmit. Az "a.nev" tartalmát pedig mindig felülírod.


Egy megoldás lehet hogy nem dolgozol lokális változókkal. A while elejére menjen:

fej = (AUTO*) realloc(fej,*count * sizeof(AUTO));

aktualis = fej + *count;


a.nev, a.orszag, a.pontszam helyett pedig értelemszerűen aktualis->nev, aktualis->orszag és aktualis->pontszam legyen.


Gondolom eredetileg így is akartad csinálni mert félig már megvan.


Másik lehetőség hogy a legjobb nem az "a.nev"-re mutat hanem a "(fej+*count)->nev"-re, miután lefoglaltad és átmásoltad azt. Még jobb ha nem külön tárolod a min és a legjobb változókat hanem csak egy pointert a struktúrára. amit -újra hangsúlyozom- le kell foglalni! Az "a" helye a memóriában nem változik.

2016. máj. 16. 11:08
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:

Elírtam, javítva:

fej = (AUTO*) realloc(fej,(*count+1) * sizeof(AUTO));

aktualis = fej + *count;


Hiszen kihagytam a count növelését nem raktam át.

2016. máj. 16. 11:14
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:

Köszönöm, így már működik.


Ez most sokat segített!

2016. máj. 16. 16:57

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!