probleme mit fgets()
-
Hi Leute,
hab ein problem mit fgets und zwar funktioniert diese funktion, so wie ich sie anwende (s.u.) auf meinem rechner gut, auch auf einigen anderen geht sie, doch bei einem kumpel von mir, der einen ausreichend guten rechner hat, stürzt das programm ab, obwohl er auch den gleichen file öffnet, also daran liegts nicht. hat jemand eine idee wieso? auch wenn ihr nur vermutungen habt, ist mir egal, besser als nix!!
void readstr(FILE *f, char *string) { objcounter=0; beendet=false; fcounter=0; counterz=0; int counter=0; int counterabc=0; char *stringz=(char *)malloc(200000); if( (int)*stringz==0) { exit(0); } for (int ize=0;ize<strlen(stringz);ize++) { stringz[ize]=0; } int kommastelle=0; while(beendet==false) { counterd=1; counterv=0; fgets(stringz, 23333, f);
-
mit welcher Fehlermeldung stürzt das Programm ab und Versuch mal das Programm mit einem Debugger zu testen. Vielleicht findest du den Fehler ja dann. Bzw. ließ mal den thread hier RTMF
-
ein Paar Anmerkungen
for (int ize=0;ize<strlen(stringz);ize++) { stringz[ize]=0; }
1 .was ist der Sinn davon? wenn du ein "leeres" String haben willst, dann mach "stringz[0] = 0;" das reicht.
2. es ist kein guter Stil, wenn du in der Bedingung eine Funktion wie strlen hast, denn bei jedem Schleifendurchlauf wird strlen ausgeführt und strlen läuft schon in O(n), also das ganze in O(n²). Am besten
size_t i, str_len; str_len = strlen(string); for(i = 0; i < str_len; ++i) { /* CODE */ }
Allerdings möchte ich anmerken, dass dein strlen(stringz) an dieser Stelle nicht definiert ist, weil der Speicher nicht initialisiert ist. Oder war jetzt ein Tippfehler von dir?
3. Statt eine for-Schleife benutze dafür man: memset(3). Damit kannst du n Bytes mit einem gleichen Byte setzen.
memset(stringz, 0, laenge_in_bytes);
char *stringz=(char *)malloc(200000);
Thou shalt not cast malloc
if( (int)*stringz==0) { ... }
was soll das bringen? Oder versuchst du zu casten und mit NULL zu überprüfen?
btw. NULL ist nicht zwangsläufig identisch mit dem nummerischen Wert 0. D.h. mach es lieber so:if( stringz == NULL ) { exit(0); /* oder was auch immer */ }
-
hi, all diese dinge sind sachen, die ich um geschrieben habe um zu testen ob das dann geht, und es war immer das gleiche bei mir gings und bei meinem kumpel net.
Das mit dem casten, das ist um den rückgabewert von malloc zu testen (hab zu mindest eine quelle wo der nummerische wert als rückgabewert von malloc angegeben wird). der versuch mit strlen etc alles auf 0 zu setzten, war auch einfach nur mal so um das zu testen
. ich frage euch ja nicht befor ich nicht selbst mal alles was mir einfällt (und sei es noch so blöd ...
) getestet hab.
aber das mit strlen wusste ich noch gar nicht, dass diese funktion nicht alle stellen die für den string reserviert sind zurückgibt, sondern nur den initialisierten teil
genau verstanden hab ich allerding nicht : Thou shalt not cast malloc.
heisst das dass ich malloc nicht casten soll? wieso?danke für die beiden antworten, und den link von mosta schau ich mir sofort an, thx euch beiden.
-
Oermel schrieb:
hi, all diese dinge sind sachen, die ich um geschrieben habe um zu testen ob das dann geht, und es war immer das gleiche bei mir gings und bei meinem kumpel net.
guck, du hast manches undefiniertes Verhalten, strlen(buffer) wenn buffer gerade durch malloc angefordert wird. malloc reserviert nur Speicher, er initialisiert dennoch den Speicher nicht, d.h. man kann nicht sagen, was an der Stelle gespeichert ist, worauf buffer zeigt. strlen guckt Stelle für Stelle bis er '\0' findet, findet strlen das nicht, dann macht es weiter, so kann es sein, dass strlen soger über die Grenzen von buffer hinauskommt, was in deiner for Schleife zu einer Katastrophe führen kann, wenn sie Stellen überschreibt, die nicht überschrieben hätten werden sollen.
Wie gesagt, du hast einige Stellen mit undefiniertem Verhalten, d.h. dass es bei dir funktioniert heißt nicht, dass es korrekt ist, sondern dass der Zufall es so wollte
Oermel schrieb:
Das mit dem casten, das ist um den rückgabewert von malloc zu testen (hab zu mindest eine quelle wo der nummerische wert als rückgabewert von malloc angegeben wird).
das ist nicht gut, gewöhn dir das nicht an.
Oermel schrieb:
der versuch mit strlen etc alles auf 0 zu setzten, war auch einfach nur mal so um das zu testen
siehe oben. Und um alles auf 0 zu setzen gibt es memset.
Oermel schrieb:
aber das mit strlen wusste ich noch gar nicht, dass diese funktion nicht alle stellen die für den string reserviert sind zurückgibt, sondern nur den initialisierten teil
RTFM
man: strlen(3) gibt die Länge der Zeichenkette zurück, nicht die Anzahl der reservierten Stellen. Das ist ein gewaltiger Unterschied.
Oermel schrieb:
genau verstanden hab ich allerding nicht : Thou shalt not cast malloc.
heisst das dass ich malloc nicht casten soll? wieso?weil in C void* implizit gecastet wird und somit muss du das nicht selber machen
char *str = malloc(...);
genügt.
-
ok, hab alles verstanden, danke sehr