2016-10-11 4 views
1

Ich bin neu in C entschied mich, es wegen bestimmter Job-Anforderungen selbst zu lernen (kannte einige Java vor diesem). Ich hoffe, ich werde nicht für diese Frage downvoted, weil ich überall über while Loops in C, die Verwendung von scanf() und Variablenzuweisungen gesucht habe, um zu sehen, ob ich irgendetwas verpasst habe, aber nichts erklärt, warum dieser Code unten auch beim Check läuft auf der Variablen status für die While-Schleife ist nicht True mehr. Dieses Programm wurde einem Lehrbuch entnommen, aber es erklärt nicht, warum es funktioniert, es ist nur ein Beispiel.While Schleife in C trat aus, auch wenn die Bedingung nicht wahr ist

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    long num; 
    long sum = 0L; 
    int status; 

    printf("Please enter an integer to be summed "); 

    printf("(q to quit): "); 

    status = scanf("%ld", &num); 

    while (status == 1) { 
     sum = sum + num; 
     printf("Please enter next integer (q to quit): "); 
     status = scanf("%ld", &num); 
    } 

    printf("Those integers sum to %ld.\n", sum); 

    return 0; 
} 

Wenn ich eine Nummer auf der Konsole eingeben, die Nummer ist eindeutig auf die Variable status zugeordnet und aus meinem Verständnis (als Eingabe von scanf gelesen werden). Die while Schleife überprüft jedoch jede Iteration, wenn status == 1 also warum, wenn ich eine Zahl eingib von scanfnach die while-Schleife beginnt und das bekommt status die Schleife läuft? Die status Variable ist eindeutig nicht mehr 1 an dieser Stelle. Aber es hört auf, wenn ich wie vorgeschlagen durch den gedruckten Satz eingeben, um q einzugeben, um zu beenden.

ich in Betracht gezogen habe, dass es vielleicht ist die Überprüfung, ob der Wert, den Sie ein integer ist eingegeben oder long zu beginnen, und wenn es keiner von denen ist (zum Beispiel, wenn der Eingang ist ein char), um die Schleife brechen. Aber das Problem ist, ich kann nirgends eine Bestätigung oder Erklärung dafür finden, warum ist nicht die Prüfung für die while Schleife überprüfen, ob status ist, dass die genaue ganze Zahl 1.

+2

Sie haben einen Tippfehler: '% 1d' ->'% ld' – LPs

+2

Sie lesen keine Zahl in 'Status'. Sie lesen eine Zahl in 'num' und dann erhält' status' die * Anzahl der Werte, die im 'scanf' Aufruf gelesen werden. Solange Sie eine gültige Zahl eingeben, wird 'status' 1 – Erik

+1

Warum denken Sie, dass die' status'-Variable nicht mehr eins ist? Du sagst es ist "Klar nicht mehr 1", aber warum sollte es nicht immer eins sein? –

Antwort

4

kaufmännisches entfernen

printf("Those integers sum to %1d.\n", &sum); 

es

printf("Those integers sum to %ld.\n", sum); 
sollte

bearbeiten Wie andere erwähnt, ist die in %1d ein Tippfehler, und es bewirkt, dass Ihr scanf eine Eins-lesen -digit int Wert. Ersetzen Sie es durch %ld ('ell' für 'lang'). Similelyy in printf der 'l' Modifikator teilt der Funktion, welche Größe von int es zu drucken bekam.

+0

Danke Ich habe ein paar Tippfehler geändert (das Buch ist extrem alt, ich habe es immer als 1 gelesen) und jetzt summiert sich das Programm richtig. – Darkphoton

3

Aber das Problem ist, ich kann nirgendwo eine Bestätigung oder Erklärung dafür finden, warum nicht die Prüfung für die while-Schleife prüft, ob der Status genau die ganze Zahl "1" ist.

Es ist. Und status ist der Rückgabewert von scanf, die die Anzahl der gelesenen Felder ist. Das wird genau dann, wenn ein gültiges Feld gelesen wurde.

+0

Deshalb ist das jetzt sehr sinnvoll. Ich konnte ehrlich gesagt in keinem Tutorial feststellen, dass dies mit der Anzahl der bis zu diesem Punkt gelesenen Felder verglichen wird, wenn ich einen Wert mit scanf einlese, den ich gewohnt bin, das als Variable zu speichern, und das dann zum Vergleich mit etwas anderem verwende . Also warum ist 'status = scanf ("% ld ", & num)' nicht den Status zu dem langen, der auf der Konsole eingegeben wird und tatsächlich den Rückgabewert? – Darkphoton

+1

@Darkphoton: 'scanf' kann mehrere Felder gleichzeitig lesen und konvertieren. Es benötigt zusätzliche Argumente, eine Adresse für jedes konvertierte Feld. Der Rückgabewert ist die Anzahl der konvertierten Felder oder 'EOF', wenn das Dateiende vor der ersten Konvertierung gefunden wurde. Der im Lehrbuch verwendete Name "status" ist irreführend, aber in Ihrem Fall kann er "1" erhalten, wenn eine Zahl konvertiert und in "num" gespeichert wurde, "0", wenn Sie etwas eingeben, das keine Zahl ist, wie z ein Buchstabe oder 'EOF' in der Enddatei. – chqrlie

+0

@chqrlie: Nochmals vielen Dank, ich habe Ihren Kommentar in Ihrer anderen Antwort oben beantwortet. Ja, ich stimme den Variablennamen zu, die es etwas verwirrend machten, also habe ich die Zuordnungen auf die falsche Art und Weise betrachtet. Es ist viel klarer jetzt danke :) – Darkphoton

Verwandte Themen