Ihr Code das Array aus seinen Grenzen zugreift jedes Mal note[i]
verwendet wird.
Im (wrong) while-Schleife ist es immer ein nach dem letzten Element (zum Beispiel in der ersten Iteration i
wird 2, genug Platz für zwei double
s zugeordnet ist, aber Sie Zugriff note[2]
die die dritte ist).
Während des Druckens verwenden Sie n
als steigenden Schleifenindex, aber drucken Sie immer note[i]
anstelle von note[n]
.
Es wäre auch eine gute Praxis, die Rückgabewerte aller Bibliotheksfunktion verwendet werden, wie open
, new
, realloc
und scanf
zu überprüfen.
Eine schnelle Lösung dieser Probleme könnte das folgende Snippet sein. Bitte beachten Sie, dass ich die gleiche Neuzuweisungsstrategie wie Ihre verwendet habe (jedes Mal), aber wie @Serge Ballesta darauf hingewiesen hat, kann dies ineffizient sein. Schauen Sie sich die Alternative in @ Jean-François Fabre zum Beispiel an.
#include <stdio.h>
#include <stdlib.h>
int main() {
double value,
*note = NULL,
*newptr = NULL;
int i,
size = 0;
char file_name[] = "numbers.txt";
FILE *ifile = fopen(file_name, "r");
if (!ifile) {
fprintf(stderr, "Error while opening file %s.\n", file_name);
exit(EXIT_FAILURE);
}
while (fscanf(ifile, "%lf", &value) == 1) {
size++;
newptr = realloc(note, size * sizeof(double));
if (!newptr) {
fprintf(stderr, "Error while reallocating memory.\n");
free(note);
exit(EXIT_FAILURE);
}
note = newptr;
note[size - 1] = value;
}
for (i=0; i < size; i++) {
printf("%lf\n", note[i]);
}
free(note); // <-- don't leak memory!
fclose(ifile);
return EXIT_SUCCESS;
}
[ 'while (! Feof (...))' ist immer falsch] (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) . – melpomene
Der Note [1] wird kein Wert zugewiesen. –
@SergeBallesta die Übung spezifiziert, einen Vektor mit einer begrenzten großen Größe nicht zu verwenden. – ovrwngtvity