Frage zu String
-
Hackerrank
Guten Tag , Abend alle zusammen.
Ich programmiere nun seid einer Woche in C++ und habe mich bei Hackerrank angemeldet.
Dort es gibt dort das Thema 30 Days of Code , ich nun bei Day 1 siehe Link.
(https://www.hackerrank.com/challenges/30-data-types/problem)Ich habe einen code geschrieben und dort funktioniert alles bis auf die Addition von zwei Strings.
der Initialisierte string [string s = "HackerRank ";] wird ausgegeben jedoch nicht mein
INPUT STRING Y.mein Code
#include <iostream> #include <iomanip> #include <limits> #include <cmath> #include <cstdio> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { int i = 4; int q = 0; double a = 4.0; double b = 0.0; string s = "HackerRank "; string y ; string r; for (int i = 0; i < 3 ; i++) { switch (i) { case 1: cin >> q ; case 2: cin >> b; case 3: getline(cin, y); } } double c = a + b; int w = i + q; r = s + y ; printf("%d \n",w); printf("%0.1f \n",c); cout << r; }; es wär sehr nett wenn mir einer helfen könnte bei meinem Problem. Bei Github gibt es auch Lösungen aber diese verfolgen einen anderen Ansatz wie ich. Mit freundlichen Grüßen Stipe. P.S bleibt gesund !
-
Ich habe Zweifel, dass das übersetzt wird .
Was soll das
string* r;
-
@manni66
ups habe mich da vertippt.
ohne dan verweis geht es trotzdem nicht.
Lg Stipe
-
@Stipe passiert in Zeile 32?
Und weißt du, dass zu einem
case
in den allermeisten Fällen auch einbreak
gehört?
-
@Stipe Warum
printf
und nicht das typsicherecout
?
-
-
@Stipe: Was soll die Zeile 32 (
y = r;
) deiner Meinung nach machen?
-
@all
ich habe rumprobiert wie gesagt bin Anfänger.
wollte nicht so schnell aufgeben.
-
Was soll die Zeile 32? Das compiliert ja nicht einmal.
Dein Problem ist die Mischung von
getline
mit formatierten Eingabefunktionen. Die Zeilen 25 und 29 bedeuten nicht, dass eine Zeile mit einer Zahl gelesen wird, sondern das eine Zahl bis zum nächsten Zeichen gelesen wird, das da nicht mehr zugehören kann. Ohne dieses nächste Zeichen. Meistens ist dieses Trennzeichen ein Leerzeichen oder Zeilenumbruch, je nachdem, was du genau eingibst. Dasgetline
hingegen bedeutet, das alles bis (und einschließlich) zum nächsten Zeilenumbruch verarbeitet wird. Und jetzt siehst du vielleicht das Problem: Nach der letzten Zahl wird da noch ein Zeilenumbruch als nächstes anstehen. Und das heißt,y
enthält nach demgetline
genau gar nichts, da vor dem nächsten Zeilenumbruch nichts stand. Ein schneller Fix für dich als Anfänger wäre eincin.ignore(1234, '\n');
vor demgetline
. Nun, und die Logikfehler mit dembreak
und die Zeile 32 musst du natürlich auch noch korrigieren, aber dazu wurde ja schon genug gesagt.Ganz wichtig noch: Benutze kein
printf
in C++, besonders nicht als Anfänger!cout
solltest du schon gesehen haben, und dann braucht man auch keine komischen Kompatiblitätsfunktionen wie dasc_str
.
-
Überprüfe mal die Werte deiner
case
-Anweisungen (in Bezug auf diefor
-Schleife)!Nur warum brauchst du überhaupt diese Schleife??? -> Loop-switch sequence
-
mein problem ist das wenn ich meinen code ausführe
eine-
int Ausgabe
-
double Ausgabe mit einer nachkommen stelle bekomme
-
und eigentlich sollte auch eine String Ausgabe kommen die lautet "HackerRank is the best place to learn and practice coding!"
stattdessen bekomme ich als string nur "HackerRank "
-
-
@SeppJ ich danke dir für deine ausführliche Erläuterung ! werde meine Code bearbeiten und schauen ob es nun past.
Melde mich anschließend
Lg Stipe
-
@Stipe Mit dem abändern deines Eröffnungspost machst du dir hier keine Freunde.
So sind die bisherigen Antworten nutzlos und missverständlich.
Zudem schaut nicht jeder, der schon eine Antwort gegeben hat, da nochmal nach.
-
@SeppJ
LÖSUNG
Hay !
habe meinen Code nun überarbeitet .
Nun funktioniert alles wie gewollt !
macht wirklich spaß die Fehler zu suchen und zu programmieren wenn auch das hier kindergarten ist ...
könntest du mir die Funktioncin.ignore(1234, '\n');
erklären ? wofür dort 1234 steht ? und das \n ist der Zeilenumbruch das weis ich.
#include <iostream> #include <iomanip> #include <limits> using namespace std; int main() { int i = 4; double d = 4.0; string s = "HackerRank "; int q = 0; double b = 0.0; string y; string r; for (int i = 0; i < 4 ; i++) { switch (i) { case 1: cin >> q ; break; case 2: cin >> b; break; case 3: cin.ignore(1234, '\n');getline(cin, y); break; } } double c = d + b; int w = i + q; r = s + y ; printf("%d \n",w); printf("%0.1f \n",c); cout << r << endl; return 0; }
-
Das wichtigste ist Hilfe zur Selbsthilfe:
https://en.cppreference.com/w/
oder
http://www.cplusplus.com/reference/Damit:
http://www.cplusplus.com/reference/istream/istream/ignore/istream& ignore (streamsize n = 1, int delim = EOF);
Extract and discard characters
...
n: Maximum number of characters to extract (and ignore).
If this is exactly numeric_limits<streamsize>::max(), there is no limit: As many characters are extracted as needed until delim (or the end-of-file) is found.
streamsize is a signed integral type.Warum habe ich 1234 geschrieben? Weil es eine große Zahl ist, die erst einmal funktioniert hätte, ohne weitere Gegenfragen zu erzeugen, was
numeric_limits<streamsize>::max(),
ist. Tatsächlich hätte in den meisten Fällen sogar 1 funktioniert. Korrekt wäre aber eigentlichcin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
, denn hier wäre einem vermutlich egal, wie viel genau übersprungen wird, sondern man möchte einfach alles bis und inklusive des nächsten Zeilenumbruchs ('\n') überspringen.