/* * Im folgenden Programm soll eine Eingabe nur bestehend aus Zahlen als String eingelesen werden. Die einzelnen Zahlen sollen extrahiert, konvertiert * und deren Summe ausgegeben werden. * * 1. Ergänzen Sie in den vorhandenen Funktionen zunächst das Schlüsselwort const bei geeigneten Parametern. * 2. Implementieren Sie nun die Funktion konvertiereZahlen, die einen String übergeben bekommt, die enthaltenen Zahlen nach int konvertiert und in einem * int-Array speichert. Der String soll nicht verändert werden. Die Funktion soll die Anzahl an extrahierten Zahlen zurückgeben oder 0, falls Wörter enthalten * sind, die keine Zahlen sind. Sehen Sie sich für die genauen Anforderung an die Funktion auch unten deren Verwendung in der main-Funktion an. Vergessen Sie * nicht, Parameter mit dem Schlüsselwort const zu markieren, wenn es Sinn ergibt. */ #include #include #include #define PUFFER_GROESSE 100 char *gibTextEin(const char *ausgabeText, char *puffer, unsigned int groesse); void gibSummeAus(const unsigned int zahlen[], unsigned int anzahl); unsigned int konvertiereZahlen(const char *text, unsigned int zahlen[], unsigned int maxZahlen); int main() { char eingabe[PUFFER_GROESSE]; unsigned int zahlen[PUFFER_GROESSE]; unsigned int vorhandeneZahlen = 0; gibTextEin("Geben Sie Zahlen ein: ", eingabe, PUFFER_GROESSE); vorhandeneZahlen = konvertiereZahlen(eingabe, zahlen, PUFFER_GROESSE); gibSummeAus(zahlen, vorhandeneZahlen); return EXIT_SUCCESS; } char *gibTextEin(const char *ausgabeText, char *puffer, unsigned int groesse) { printf("%s", ausgabeText); fgets(puffer, groesse, stdin); if(puffer[strlen(puffer)-1] == '\n') puffer[strlen(puffer)-1] = '\0'; else while(getchar() != '\n') {} return puffer; } // 1. Variante mit strtok (zahl steht separat) und a) sscanf oder b) stroul // unsigned int konvertiereZahlen(const char *text, unsigned int zahlen[], unsigned int maxZahlen) // { // unsigned int anzahl = 0; // char *kopie = malloc((strlen(text)+1) * sizeof(char)); // if(kopie != NULL) // { // const char *trenner = " \t;,.:\n"; // char *token; // strcpy(kopie, text); // token = strtok(kopie, trenner); // while(token != NULL && anzahl < maxZahlen) // { // //if(sscanf(token, "%u", &zahlen[anzahl]) == 1) // // anzahl++; // char *endZgr; // zahlen[anzahl] = strtoul(token, &endZgr, 10); // if(token != endZgr) // anzahl++; // token = strtok(NULL, trenner); // } // } // free(kopie); // return anzahl; // } // 2. Variante direkt mit strtoul (Zahl ist nahtlos in String integriert) unsigned int konvertiereZahlen(const char *text, unsigned int zahlen[], unsigned int maxZahlen) { unsigned int anzahl = 0; const char *anfangsZgr = text; char *endZgr; while(anzahl < maxZahlen && *anfangsZgr != '\0') { zahlen[anzahl] = strtoul(anfangsZgr, &endZgr, 10); if(endZgr != anfangsZgr) { anfangsZgr = endZgr; anzahl++; } else { anfangsZgr++; } } return anzahl; } void gibSummeAus(const unsigned int zahlen[], unsigned int anzahl) { int summe = 0; if(anzahl > 0) { printf("%d", zahlen[0]); summe = zahlen[0]; } for(int i = 1; i < anzahl; i++) { printf(" + %d", zahlen[i]); summe += zahlen[i]; } if(anzahl > 0) printf(" = %d\n", summe); else printf("%s", "Keine Werte vorhanden!\n"); }