Mi a hiba ebben a C kódban?
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.
#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;
}
...
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ő.
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.
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.
Köszönöm, így már működik.
Ez most sokat segített!
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!