2016-04-17 7 views
0
int sales[ 1 ]; 
do 
{ 
    scanf_s("%d", sales, 1); 

    printf("\n%d\n", sales[ 0 ]); 

    printf("\nyou got weekly income of $ %d\n\n", commision(sales[ 0 ])); 

} while (sales[0] >-1); 

mag ich fragen, warum jedes Mal, wenn ich Eingabe int mit Raum (zB 123 456), ist der Ausgang Umsatz [0] = 123 dann plötzlich automatisch 456 zum Umsatz zuordnen [0 ], können Sie es erklären, warum?Ausgang plötzlich getrennt int mit Platz

Antwort

1

Was Ihr Code tut ist, dass er eine vorzeichenbehaftete Nummer von der Standardeingabe liest. (%d liest bis zum Leerzeichen, ignoriert aber den Leerraum selbst.) Dann schreibt es diese Nummer (die erste Zahl wäre 123) in Ihr sales Array bei Index 0. Dann schreiben Sie den Rückgabewert Ihrer commision(...)-Funktion an die Standardausgabe.

dann plötzlich automatisch 456 zum Umsatz zuordnen [0]

Wenn durch, dass Sie bedeuten, dass sales[0] enthalten 456 am Ende der Ausführung des Programms statt 123 es ist, weil das ganze Verfahren I beschrieben oben ist getan, solange Ihre do while Schleife läuft. Und wenn Umsatz [0] größer als -1 ist, was der Fall ist, weil sales[0]123 nach dem ersten Verfahren ist, wird es wieder laufen und lesen Sie 456 von der Standardeingabe und schreiben Sie das auf die sales Array.

Einige weitere Beispiele für scanf_s("%d", int_pointer, 1) Lesen Eingabe von stdin:

  • Eingang 42 43ab 44 würde in 3 verschiedenen scanf_s als 42, 43 und 44 gelesen werden.
  • Eingabe 42 a würde in 2 verschiedenen scanf_s als 42 und 0 gelesen werden.
  • Eingang 42 a a43 44 würde in 4 verschiedenen scanf_s als 42, 0, 044 und gelesen werden.
+0

ich sehe .... aber warum die Regel gilt nicht für Char-Typ (Beispiel ich Eingabe ab [Leerraum] d die Ausgabe nur Sales = "ab" und die Zeichenfolge nach [Leerraum] gelöscht? und eins mehr noch, ich habe immer noch verwirrt, wo hat der compiler die 456 gespeichert? denn zuerst hat er 123 zu sales [0] zugewiesen und es gibt keine variable übrig für das speichern von 456 .... nach der ersten schleife macht es die 2. schleife (scanf statement), warum der scanf plötzlich die 456 bekommt woher kam ich? correct me wenn ich bin –

+0

Was meinst du mit "apply for char type"? Wenn deine Variable vom Typ 'char' ist (wie' char sales [1] ') und du machst' scanf_s ("% d", sales, 1) 'dann interpretiert' scanf_s' die Eingabe immer noch als eine vorzeichenbehaftete Ganzzahl. Das bedeutet, sobald du zBBei Leerzeichen oder Zeilenumbrüchen wird die Eingabe geparst und alle Zeichen der Eingabe, die einen gültigen vorzeichenbehafteten int bilden, werden in die Variable "hineingelegt" (hier 'sales') - alle nachfolgenden werden ignoriert (Eingabe' 42ab' = '42 'Wenn (wie in meinem obigen Beispiel)' sales' vom Typ 'char' ist, wird die gelesene Ganzzahl eine 8 Bit Eins anstelle von 32 (die meisten' Int's) oder 64 Bit sein – mxscho

+0

Der Compiler macht hier nichts. Zur Laufzeit des Programms geschieht alles. Bei der zweiten Ausführung von 'do while' ersetzt' scanf_s' nur den Wert in 'sales [0]' - also wird '123' durch' 456' ersetzt. – mxscho

0
int commission(int i) { 
    return 42*i; 
} 

int main(int argc, const char * argv[]) { 
    int sales[ 1 ]; 
    do 
    { 
     scanf_s("%d", sales, 1); 

     printf("\n%d\n", sales[ 0 ]); 

     printf("\nyou got weekly income of $ %d\n\n", commission(sales[ 0 ])); 
     sales[0] = -1; // Won't jump to the next value 
    } while (sales[0] >-1); // But then what's the point of the loop? 

    return 0; 
} 
+0

Wie beantwortet das die Frage? Oder versuchst du hier eine andere Frage zu stellen, Philip? – Pang

1

Da Scanf pingelig ist und sie will die genaue Eingabe einer Nummer. Der Whitespace signalisiert dazu das Ende des gewünschten Eingabeformats.

123 [whitespace] -> 123 ist zugewiesen, stuff passiert, schleift wieder.

456 [whitespace] -> 456 zugewiesen, stuff passiert, schleifen wieder.