invalid conversion from `char' to `const char*'
-
Beim erneuten durcharbeiten, der übungsbeispiele eines bekannten c++ online tutorial, bin ich auf folgende problematik gestoßen.
Das beispiel hört sich vorerst einmal völlig harmlos an:
Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe einer vierstelligen Zahl auffordert. Das Programm soll daraufhin die Quersumme der vierstelligen Zahl errechnen und das Ergebnis dann auf den Bildschirm ausgeben. Hinweis: Je nach Lösungsansatz benötigen Sie wie in Aufgabe 1 die Funktion atoi() zum Umrechnen von Zahlen innerhalb eines Arrays vom Typ char in Werte vom Typ int.
Soweit alles in ordnung. Der Leser hat bis zu diesem punkt noch nichts über schleifen aka „kontrollstrukturen“ gelernt. Auch der % modulo operator wurde nur gestreift. Arrays wurden nur im zusammenhang mit char datentypen erläutert.
Nun wird im letzten satz der aufgabestellung die atoi funktion erwähnt, mit der eine lösung möglich ist. Vor dem geistigen auge sieht der code dann wie folgt aus:
#include <iostream> #include <cstdlib> using namespace std; char a[3]; int summe = 0; int main(void) { cout << "Geben Sie eine Zahl ein: " << flush; cin >> a; int summe = atoi(a[0]) + atoi(a[1]) + atoi(a[2]) + atoi(a[3]); std::cout << b << std::endl << std::endl; system ("PAUSE"); }Alles soweit logisch, die atoi funktion noch einmal gegoogelt um weitere infos zum einsatz dieses befehls erhalten, kompiliert und zur erkenntnis gekommen dass das ganze vorhaben wohl so nicht funktionieren wird.
Der knackpunkt liegt in zeile 17 die zur fehlermeldung „invalid conversion from `char' to `const char*'“ führt.
Meine fragen wären nun,
warum funktioniert das beispiel so, speziell auf die atoi funktion nicht?
wie soll man dieses beispiel ohne modulo operator oder schleifen vernünftig lösen ?Danke im voraus
-
Schlechtes C++ Tutorial. In C++ nimmt man stringstreams und nicht atoi. Das mit der Arraygroße und was ein Array und ein Zeichen ist, hast du auch noch nicht verstanden.
-
Schlechte Art:
#include <iostream> #include <cstdlib> using namespace std; char str[4]; int summe = 0; int main(void) { cout << "Geben Sie eine Zahl ein: " << flush; cin >> str; summe = (int)(str[0]) + (int)(str[1])+ (int)(str[2]) + (int)(str[3]); summe -= 4*48; std::cout << summe << std::endl << std::endl; }(C-Casts, arbeiten mit Arrays, ebenfalls böse. Du hast nämlich bereits einen Fehler drin bei dir (unabhängig von atoi)).
Bessere Art:
#include <iostream> #include <cstdlib> #include <string> #include <sstream> using namespace std; std::string str; int summe = 0; int main(void) { cout << "Geben Sie eine Zahl ein: " << flush; cin >> str; for (int i = 0; i < 4 ; i++) { std::stringstream val; int s = 0; val << str[i]; val >> s; summe += s; } std::cout << summe << std::endl << std::endl; }
-
drakon schrieb:
summe = (int)(str[0]) + (int)(str[1])+ (int)(str[2]) + (int)(str[3]); summe -= 4*48;Wie waere es mit
char digit(char c) { return c-'0'; } summe = digit(str[0]) + digit(str[1]) + digit(str[2]) + digit(str[3]);und das ganze ohne mit kanonen auf spatzen zu schiessen

-
Shade Of Mine schrieb:
drakon schrieb:
summe = (int)(str[0]) + (int)(str[1])+ (int)(str[2]) + (int)(str[3]); summe -= 4*48;Wie waere es mit
char digit(char c) { return c-'0'; } summe = digit(str[0]) + digit(str[1]) + digit(str[2]) + digit(str[3]);und das ganze ohne mit kanonen auf spatzen zu schiessen

Och.. Shade.. ich wollte es doch so hässlich, wie möglich machen..

Ich will ja nicht, dass er sich solchen Mist angewöhnt.
-
Das es möglichkeiten gibt dieses beispiel auf verschiedenste wege mit den möglichkeiten der programmiersprache zu lösen, finde ich gut.
Ist man aber aufgrund seines leider noch geringen wissens über c++ noch nicht in der lage alle möglichkeiten auszuschöpfen, frage ich mich wie dieses beispiel mit array und atoi lösbar ist.
Dieses Quersummenbeispiel wurde auch schon von mir gelöst, das ist nicht die frage. Hätte ich aber damals nicht einfach weitergelesen und dieses beispiel ausgelassen um es mit später im tutorial vermittelten wissen zu lösen, wie hätte ich das ganze mit dieser sprachlimitierung lösen sollen ?
-
cl1985 schrieb:
Ist man aber aufgrund seines leider noch geringen wissens über c++ noch nicht in der lage alle möglichkeiten auszuschöpfen, frage ich mich wie dieses beispiel mit array und atoi lösbar ist.
Das ist aber eine schlechte Einstellung, denn gerade z.B.
atoigehört viel eher zur Programmiersprache C als zu C++. In C++ hat man wie gesagt die Möglichkeit, mit Stringstreams,std::stringund Containern zu arbeiten, die wirklich sehr vieles vereinfacht. Das ist nicht einmal unbedingt schwieriger zu lernen, wird sich im Gegenzug aber als sehr hilfreich erweisen.
-
cl1985 schrieb:
Ist man aber aufgrund seines leider noch geringen wissens über c++ noch nicht in der lage alle möglichkeiten auszuschöpfen, frage ich mich wie dieses beispiel mit array und atoi lösbar ist.
Die Array Loesung hast du von mir bekommen. Die atoi Loesung darfst du dir selber ueberlegen. Sie beinhaltet keine arrays, dafuer aber die beiden operatoren / und %
aber wenn du sagst, du hast es bereits geloest - worum geht es dir hier...?
-
Ich habe einfach nochmal im schnellverfahren die auf http://www.highscore.de/cpp/einfuehrung/index.html am ende jedes kapitels erneut durcharbeiten wollen, als prüfungsvorbereitung. Dabei viel mir dieses beispiel auf. Hat man dieses online tutorial bis dahin gelesen, wurde meiner meinung nach noch zu wenig wissen vermittelt. Auch wird man einfach so auf den atoi befehl losgelassen. Ich habe weniger die qualität des tutorials hinterfragt als meine meine programmierkenntnisse.