2017-11-25 3 views
-1

Ich schreibe ein Programm, das den Kauf von Autos simuliert. Das Programm funktioniert gut beim ersten Durchlauf, aber nachdem der Kauf getätigt wurde und die Eingabeaufforderung nach einem Namen fragt, sucht gets() nicht nach Eingabe. Hier ist mein Code.bekommt(); Funktion wartet nicht auf Eingabe auf der zweiten Schleife in C

#include <stdio.h> 

int i; 
int j=1; 
int prices[5] = { 24000,28000,25000,20000,120000 }; 
int invent[5] = { 5,2,3,8,2 }; 
int purchased[5] = { 0, 0, 0, 0, 0 }; 

int main() 
{ 
    char name[50]; 

    printf("Welcome to Buy-a-Car!\nPlease enter your name:\n"); 
    gets(name); 
    printf("Welcome, %s. Here is our available inventory.\n", name); 
    sale(); 
    return 0; 
} 

void sale() 
{ 
    while (i>0, j != 0) { 
     printf("1. Toyota Camry  %d %d\n2. Honda CRV   %d %d\n3. Honda Accord  %d %d\n4. Hyundai Elantra %d %d\n5. Audi R8   %d %d", invent[0], prices[0], invent[1], prices[1], invent[2], prices[2], invent[3], prices[3], invent[4], prices[4]); 
     printf("\nWhich car would you like to purchase?\n"); 
     scanf("%d", &i); 
     i = i - 1; 
     printf("How many would you like to purchase?\n(Note: To checkout, please press 0.)\n"); 
     scanf("%d", &j); 
     if (j > invent[i]) 
      printf("I'm sorry, that number is insufficient. Please try again.\n"); 
     else 
      invent[i] = invent[i] - j; 
     purchased[i] = j; 
    } 
    checkout(); 
} 
void checkout() 
{ 
    printf("Review of transaction:\n1. Toyota Camry  %d %d\n2. Honda CRV  %d %d\n3. Honda Accord  %d %d\n4. Hyundai Elantra %d %d\n5. Audi R8   %d %d", purchased[0], prices[0], purchased[1], prices[1], purchased[2], prices[2], purchased[3], prices[3], purchased[4], prices[4]); 
    int total; 
    for (i = 0; i < 5; i++) 
    { 
     total = total + (purchased[i] * prices[i]); 
    } 
    printf("\n\nTotal: %d\n\n\n", total); 

    j = 1; 
    int purchased[5] = { 0, 0, 0, 0, 0 }; 
    main(); 
} 
+0

Welches Betriebssystem verwenden Sie? Außerdem möchte ich darauf hinweisen, dass die Funktion 'gets()' vor langer Zeit als veraltet eingestuft wurde, da sie inhärent unsicher ist. Sie sollten es wahrscheinlich gegen 'scanf()' oder 'gets_s()' austauschen. – paulotorrens

+0

Windows 10. Ich verwende einen Online-Compiler, der _s Funktionen nicht erkennt. Ich würde scanf verwenden, wenn nicht aus Angst vor Datenverlust (d. H. Kunde gibt Vor- und Nachname ein, scanf liest nur zuerst). –

+0

Wie soll das Programm jemals enden? – jwdonahue

Antwort

0

Es ist, weil die '\ n' char in Puffer nach Gebrauch Scanf, Verwendung scanf ("% d% * c" & var); % * c verhindert, dass '\ n' die Zeile überspringt, wenn gets verwendet wird

wird nicht sicher, verwenden Sie fgets (& str, sizeof (str), stdin);

0

Nach der Ausführung von scanf() befindet sich die Eingabe (und alles vorher) immer noch im Eingabepuffer. Sie können es wie folgt löschen:

scanf("%*[\n]%*c"); 

oder

while(getchar() != '\n'); 

Jetzt gets() wird eine leere Zeichenfolge nicht zurück. Aber egal, es ist extrem entmutigt, es zu benutzen. Verwenden Sie stattdessen fgets oder scanf("%[^\n]").

fgets(name, sizeof(name), stdin); 
// or 
scanf("%[^\n]", name); 

Außerdem nicht nennen main() von überall in Ihrem Programm. Sein Verhalten ist nicht definiert. Sie können das ganze Zeug in eine andere Funktion einpacken und eine Schleife verwenden. Ein endloser Rekursionsanruf wird sicherlich den Stack sprengen.

Verwandte Themen