Ist std::cin.getline das Problem?



  • Guten Tag,

    der Fehler des hier aufgeführten Programms ist, dass beim "Neustarten" des Programmes keine Werte mehr bei cin.getline eingegeben werden können. Weiß jemand Rat? Ich habe mir auch schon den Aufbau dieses Befehls angeschaut. Liegt es eventuell daran, dass ein Flag gesetzt wird?

    mfG Phisherman

    #include <iostream>
    #include <string>
    #include <windows.h>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {   
        bool reset=true;
        char set;
        while(reset!=false)
        {
        char eingabe[100000]={0};
    
        char i=0;
        bool hoch;
        bool tief;
        int v;
    
        system("color f0");
    
      //eingabe[0]='\0';
    
        cout<<"Beepmachine Developer Edition 1.0";
    
        //Programm
        cout<<"\n\nTastenbelegung: ";
        cout<<"\np: Pause";
        cout<<"\nl: Lange Pause";
        cout<<"\nk: Kurze Pause";
        cout<<"\n#: # Halbton nach oben (Gilt f"<<char(129)<<"r den nachstehenden Ton)";
        cout<<"\nb: b Halbton nach unten (Gilt f"<<char(129)<<"r den nachstehenden Ton)";
        cout<<"\n1: C6";
        cout<<"\n2: D6";
        cout<<"\n3: E6";
        cout<<"\n4: F6";
        cout<<"\n5: G6";
        cout<<"\n6: A6";
        cout<<"\n7: H6";
        cout<<"\n8: C7";
        cout<<"\n9: D7";
        cout<<"\n\nHINWEIS: Sowohl die Pause als auch die Noten dauern 200ms an.";
        cout<<"\n\nZuerst musst du die Noten (und Pausen) eintippen.";
        cout<<"\nWenn du das getan hast, dr"<<char(129)<<"cke die Enter-Taste.";    
        cout<<"\n\nGebe maximal 100.000 Zeichen ein: ";
    
        cin.getline(eingabe, 100000);  // Diese Stell spinnt!
        cout<<endl<<endl;
    
        for (unsigned int z = 0; z < strlen(eingabe); ++z)
           {    
            switch (eingabe[z])
            {
             case 'l': //Lange Pause
                  {
                   cout<<"L. Pause ";
                   Sleep(400);
                   break;
                  }
             case '#': //halbton hoch
                  {
                   cout<<"#";
                   hoch=true;
                   break;
                  }
             case 'b': //halbton hoch
                  {
                   cout<<"b";
                   tief=true;
                   break;
                  }
             case 'k': //Kurze Pause
                  {
                   cout<<"K. Pause ";
                   Sleep(100);
                   break;
                  }
             case 'p': //Pause
                  {
                   cout<<"Pause ";
                   Sleep(200);
                   break;
                  }
             case '1': //C6
                  {
    
                   v=1046;
                   if (hoch==true)
                     {
                                 v=v+62;
                     }
                   if (tief==true)
                     {
                                 v=v-59;
                     }
                   cout<<"C6 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '2': //D6
                  {
                   v=1174;
                   if (hoch==true)
                     {
                                 v=v+70;
                     }
                   if (tief==true)
                     {
                                 v=v-66;
                     }
                   cout<<"D6 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '3': //E6
                  {
                   v=1318;
                   if (hoch==true)
                     {
                                 v=v+78;
                     }
                   if (tief==true)
                     {
                                 v=v-74;
                     }
                   cout<<"E6 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '4': //F6
                  {
                   v=1396;               
                   if (hoch==true)
                     {
                                 v=v+80;
                     }
                   if (tief==true)
                     {
                                 v=v-78;
                     }
    
                   cout<<"F6 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '5': //G6
                  {
                   v=1567;
                   if (hoch==true)
                     {
                                 v=v+94;
                     }
                   if (tief==true)
                     {
                                 v=v-88;
                     }
                   cout<<"G6 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '6': //A6
                  {
                   v=1760;
                   if (hoch==true)
                     {
                                 v=v+104;
                     }
                   if (tief==true)
                     {
                                 v=v-99;
                     }
                   cout<<"A6 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '7': //H6
                  {
                   v=1975;
                   if (hoch==true)
                     {
                                 v=v+118;
                     }
                   if (tief==true)
                     {
                                 v=v-111;
                     }
                   cout<<"H6 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '8': //C7
                  {
                   v=2093;
                   if (hoch==true)
                     {
                                 v=v+124;
                     }
                   if (tief==true)
                     {
                                 v=v-118;
                     }
                   cout<<"C7 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             case '9': //D7
                  {
                   v=2349;
                   if (hoch==true)
                     {
                                 v=v+140;
                     }
                   if (tief==true)
                     {
                                 v=v-132
                                 ;
                     }
                   cout<<"D7 ";
                   Beep(v, 200);
                   tief=false;
                   hoch=false;
                   break;
                  }
             }
    
          }
    
        cout<<"\n\nProgramm neustarten (y/n)? ";
        cin>>set;
        cout<<set;
        if (set=='y')
           {
           reset=true;
           system("CLS");
           }
        else if (set=='n')      
           {
           reset=false;
           }    
        }
    
    }
    


  • Stichwort: std::cin.ignore();

    Zum Codestyle:

    if (hoch==true)
                     {
                                 v=v+62;
                     }
                   if (tief==true)
                     {
                                 v=v-59;
                     }
    

    lässt sich auch als:

    if(hoch)
        v += 62;
    
    else if(tief)
        v -= 59;
    

    schreiben 😉

    Außerdem ist

    for (unsigned int z = 0; z < strlen(eingabe); ++z)
    

    langsam, da bei jeden Schleifendurchgang strlen aufgerufen wird. Das geht performanter 🙂



  • Mhm, hast Recht.
    Ja, das strlen kann ich, indem ich davor die Länge des CStrings überprüfe, ersetzen.
    Und das mit v+=62 etc. ist gut, danke! Der Code ist aber lange noch nicht fertig. Es geht mir momentan nur um das getline Problem.

    Vielen Dank für deine Hilfe zu später Stund'.^^

    Könntest du mir ein Beispiel für cin.ignore zeigen bzw. es gleich in den Code einbauen, dass ich es verstehe?
    Das Beispiel auf der Referenzseite ist zwar verständlich, jedoch weiß ich nicht, wie ich es in diesem Fall anwenden sollte. Merci



  • // ...
    cin.ignore(); // Defaultparameter sind in diesem Fall völlig ausreichend
    cin.getline(eingabe, 100000);
    // ...
    

    sollte reichen 😉



  • Vielen Dank! 😃



  • Ich habe jetzt das Problem noch nicht ganz gelöst.
    Jetzt wird der erste Ton beim ersten Abspielen des Programms nicht wiedergegeben. Nach dem "Neustarten" geht es aber. Was muss ich ändern?


Anmelden zum Antworten