2017-04-05 5 views
0

Mein Programm versucht, einen Verkaufsautomaten zu simulieren. Alles funktioniert, außer für den Teil, wo die Münzen zurückgegeben werden oder die Änderung zurückgegeben wird. Ich versuche, die Menge der in die Maschine eingefügten Cents zu nehmen und diese in einen anderen Code außerhalb der Haupteingabe einzugeben, und gebe dann eine Zeichenkette zurück. Ist das in C möglich, weil ich eine Initialisierung bekomme, macht den Zeiger aus der ganzen Zahl ohne einen Zauberfehler. Wenn das nicht möglich ist, irgendwelche Ideen, wie ich das machen könnte?So geben Sie eine Zeichenfolge mit Variablen in c zurück

Danke!

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#define NI 5 
#define DI 10 
#define QU 25 



bool isValid(int num) { 
    return (num >= 10 && num <= 100); 
} 

bool isMultiple(int num) { 
     return (num % 5 == 0); 
} 


char *coinReturn(int insert) { 

           int dimes = insert/DI; 
           int remainder = insert % DI; 
           int nickels = remainder/NI; 
           int remainder2= nickels % NI; 
           char *m = ("Change returned. %d nickels and %d dimes\n",nickels, dimes); 
           return m; 
} 


int 
main (int argc, char *argv[]) 
{ for (int i = 1; i != argc; ++i) { 
     int price = atoi(argv[i]); 
     if (!isValid(price)) { 
      printf("Price muse be from 10 cents to 100 cents.\n"); 
      break; 
     } else if (!isMultiple(price)) { 
       printf("Price must be a multiple of 5.\n"); 
       break; 
     } else { 
       printf(" Welcome to my Vending Machine!\n"); 
       printf("Pop is %d cents. Please enter nickels, dimes, or quarters\n", price); 

         int cents = 0; 
         char coin = '\0'; 

         while (cents <= price && coin != 'E') { 
         printf(" PLease enter a coin [NDQR]\n"); 
         scanf (" %c", &coin); 

         if (coin == 'N'|| coin == 'n') { 
           cents = cents + NI; 
           printf(" You have inserted 5 cents\n"); 
         } 
         else if (coin == 'd' || coin == 'D') { 
           cents = cents + DI; 
           printf("You have inserted 10 cents\n"); 
         } 
         else if (coin == 'Q' || coin == 'q') { 
           cents = cents + QU; 
           printf("You have entered 25 cents\n"); 
         } 
         else if (coin == 'R' || coin == 'r'){ 
           printf("Change requested\n"); 
           char *rtn2= coinReturn(cents); 
           printf("%s\n",rtn2); 
         } else { 
           printf("Unknown coin. Rejected.\n"); 
         } 
         int balance = price - cents; 
         printf("You have entered a total of %d cents\n", cents); 

         if (balance > 0) { 
         printf("You must enter %d more cents\n", balance); 
        } else { 

           char *rtn = coinReturn(cents); 
           printf("%s\n",rtn); 
         cents = 0; 

        } 

        } 


       printf("DONE!\n"); 
       return 0; 
} 
} 

Antwort

0

Dies wird nicht zur Arbeit gehen:

char * m = ("Change zurück% d Nickels und Dimes% d. \ N", Nickels, Dimes);

Vielleicht loswerden der char * und einfach printf aufrufen?

+0

Aber ich muss die Aussage irgendwie zurückgeben. Kann ich das mit einem printf machen? – JVAN

+0

Nein. Du könntest einen Puffer "malloc", benutze ['snprintf'] (http://www.cplusplus.com/reference/cstdio/snprintf/), um ihn zu formatieren, und gib ihn dann zurück. –

+0

Aber alles, was Sie mit der Rückkehr tun, ist printf es. Warum druckst du nicht einfach in der Funktion? –

0

Es ist tatsächlich möglich zu tun, was Sie sagen. Hier sind zwei Lösungen, die Ihnen gefallen könnten:

Lösung 1: Verwenden von printf statt zurückgeben.

Zu allererst Sie Formatierung der Zeichenfolge nicht tatsächlich von

Schreiben

char *m = ("Change returned. %d nickels and %d dimes\n", nickels, dimes);

Wir müssen diese Werte an eine Funktion zu übergeben die tatsächliche Formatierung zu tun!

Zweitens, ich weiß nicht, warum wir von coinReturn zurückkehren müssen ... wenn wir einfach

printf("Change returned. %d nickels and %d dimes\n", nickels, dimes);

schreiben könnte, und wir sind fertig!

Aber vielleicht wollen wir das nicht. Vielleicht wollen wir eigentlich einen String-Zeiger für diese Funktion zurückkehren, können wir das auch passieren :)

Lösung 2: snprintf verwenden und einen Zeiger auf einen statischen Puffer

char *coinReturn(int insert) { 
    // set aside a buffer for our string. 
    static char buf[512]; 
    int dimes = insert/DI; 
    int remainder = insert % DI; 
    int nickels = remainder/NI; 
    int remainder2= nickels % NI; 
    // output our string into the buffer. 
    snprintf(buf, sizeof(buf), 
     "Change returned. %d nickels and %d dimes\n", nickels, dimes); 
    return buf; 
} 

Zum einen kehren wir setzen beiseite einige Speicher unsere formatierten String zu speichern,

static char buf[512];

Hinweis ist es neccesary buf als static so zu erklären, es überlebt den Umfang unserer coinReturn Funktion.

512 ist unsere maximale Stringlänge, das sollte hier mehr als genug sein.

Lets in diesem nächsten Teil einen Blick:

snprintf(buf, sizeof(buf), 
    "Change returned. %d nickels and %d dimes\n", nickels, dimes); 

(siehe: https://linux.die.net/man/3/printf)

Das erste Argument ist der Ort, an dem unser String geschrieben wird, buf.

Das zweite Argument ist die maximale Anzahl der Bytes snprintf wird schreiben (einschließlich der Null-Terminator).

Die letzten Argumente sind wie printf, die Sie bereits kennen.

return buf; 

Und schließlich können wir buf geben das Ergebnis zu wissen, wird ein Zeiger auf unsere formatierten String sein.


Aus diesen beiden Lösungen, die ersten auf jeden Fall macht mehr Sinn - es gibt eine Menge von Fragen, die ich mit # 2 (zum Beispiel: es ist nicht Thread-sicher) zu sehen, aber es der Job zu erledigen ist, wenn Das ist alles was du willst.

Verwandte Themen