2016-03-20 6 views
0

Ich habe versucht, eine Funktion in C zu erstellen, die Doubles liest, die dann in einem Array gespeichert werden. Ich möchte in der Lage sein, die Größe des Arrays zurückzugeben, so dass ich es in main verwenden kann. Der Zweck dieser Funktion besteht also darin, den Benutzer aufzufordern, Werte in ein Array einzugeben und^d (ctrl + d) oder EOF einzugeben, um die Schleife zu beenden.C Programmierung: Verwenden der Funktion zum Zurückgeben der Größe des Arrays

#include <stdio.h> 

//Prototype Declaration 
int getdata(double[], int); 

int main(int argc, char* argv[]) { 
double array[20]; 
int count = 0, max = 20; 

//Calls the getdata function 
count = getdata(array, max); 
printf("%s%lf%s","Array1: " ,array[1], "\n"); 
printf("%s%d%s", "Count is: ", count, "\n"); 
return 0; 
} 

----- (Ich bin die Verknüpfung Module, so dass diese in verschiedenen Dateien sind) -------

#include <stdio.h> 

//Define getdata.c 
int getdata(double values[], int limit){ 
printf("%s","Please enter your values into the array.\n"); 
int count = 0; 
double n; 
while ((count < limit) && (scanf("%lf",&n) != EOF)) { 
    values[count] = n; 
    count++; 
} 
return count; 
} 

Was passiert, ist jedoch, dass, wenn ich die Pause Schleife früh, gehen die Array-Werte durch feine, aber die Anzahl würde nur 20 ausdrucken. Ich gehe davon aus, dass das Programm automatisch den Rest der leeren Indizes mit etwas füllt und weiterhin den Zählwert inkrementieren, nachdem ich EOF eingeben. Was kann ich tun, damit das Programm die Menge der eingegebenen Werte korrekt ermitteln kann? Ich schreibe nicht viel in C. Ich arbeite hauptsächlich in C++. Ich bin vertraut mit der Weitergabe durch Verweis, aber mit C.

+3

Überprüfen Sie die Dokumentation von 'scanf', um zu sehen, was es zurückgibt –

+1

Beachten Sie, dass die Deklaration von' getdata() 'in einer Kopfzeile sein sollte, die sowohl in der Datei definiert' main() 'und in der Datei' definiert ist getdata() '. Auf diese Weise dient die Header-Datei als Kleister, der überprüft, dass beide Quelldateien sich auf die korrekte Deklaration/Definition von "getdata()" einigen. –

+0

Dieser Code scheint zu funktionieren: 'echo 3 4 5 | main' prints 'Anzahl ist: 3'. –

Antwort

2

Sie müssen sich bewusst sein, dass scanf() nicht Eingang schlucken, die nicht konvertiert werden kann. Wenn es ein Problem gibt, bleibt der (fehlerhafte) Eingang im Stream, damit Sie bei der nächsten Iteration der Schleife nicht konvertieren können. Es wird also wiederholt versucht, dasselbe ungültige Ding wie ein Double zu finden.

Ich schlage vor, fgets() Plus sscanf() als bessere Lösung unter Verwendung als scanf(), oder (mindestens) überprüfen Sie den Rückgabewert von scanf(), um sicherzustellen, hätte man die erwartete Anzahl von Feldern lesen (was 1 ist in diesem Fall). Ich wette, dass es 0 anstatt EOF zurückgibt, also wird Ihre Schleife fortgesetzt, bis countlimit entspricht.

Verwandte Themen