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 ein break gehört?



  • @Stipe Warum printf und nicht das typsichere cout ?



  • @Stipe

    ups habe mich da vertippt.

    Du zeigst also nicht deinen Code.



  • @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.


  • Mod

    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. Das getline 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 dem getline genau gar nichts, da vor dem nächsten Zeilenumbruch nichts stand. Ein schneller Fix für dich als Anfänger wäre ein cin.ignore(1234, '\n'); vor dem getline. Nun, und die Logikfehler mit dem break 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 das c_str.



  • Überprüfe mal die Werte deiner case-Anweisungen (in Bezug auf die for-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 Funktion

    cin.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;
    }
    
    

  • Mod

    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 eigentlich cin.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.


Log in to reply