Merkwüriges Verhalten in switch-Block



  • Heyho!

    Ich habe folgendes Problem.

    case 3: cout << "Nachricht: "; 
             do
             {
              i++;
              test[i] = getchar();
             }
             while 
             (
             test[i] != '\n');
             test[i] = '\0'; 
             send();
             break;
    

    In dem Case soll eine Nachricht eingetippt werden(eigentlich müsste dies einfacher mit der Funktion gets gehen). Anschließend wird die Funktion send aufgerufen um die Nachricht zu verschicken. Doch leider wird der Case nicht sachgemäß ausgeführt. Anstatt mir die Zeit zu geben, die Nachricht einzutippen, geht man sofort in die Funktion "send", welche aber einen Fehler zurückgibt, da keine Nachricht vorhanden ist.
    Bin ziemlich ratlos. Denn der Theorie nach finde ich dort keinen Fehler drin. Aber die Praxis ist ja was völlig anderes als die Theorie. XD

    Ich benutze wx-devc++.

    Wäre schon ne tolle Sache, wenn jemand die Zeit dazu hätte, dort den Fehler zu finden.

    Sollte euch der Codeschnipsel nicht reichen, kann ich auch das bisherige Programm hier ausstellen.

    MFG

    Takeo



  • warum benutzt du nicht getline?
    wäre doch besser als so ne blöde schleife.



  • Hallo,

    du solltest wirklich getline verwenden:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
      string str("");
      getline(cin, str);
      cout<<"Sie haben "<<str<<" eingegeben.\n";
      return 0;
    }
    

    Vermutlich ist dein Fehler damit schon behoben.

    MfG

    GPC



  • Habe es eben mit getline ausprobiert, geht ebenfalls nicht.

    Hier mal die send-Funktion, wobei ich meinerseits eig. ausschließe, das es an dieser liegt.

    void send()
    {
    
     if(sigstat==1)
     {
     Total = Befehl + sfPC + " " + SMSG + " +++ " + sig;
     }
     else
     {
      Total = Befehl + sfPC + " " + SMSG;
     }    
    
     system(Total.c_str());
     system("cls");
     cout << "==> Nachricht wurde geschickt!" << endl;
     session();    
    }
    

    Wenn man öfters diesen Case durchläuft, kann man den Satz lesen, das dass senden von Dateien nicht länger unterstützt wird. Bezieht sich auf "net send". Irgendwie scheint der übergebene String nicht zu stimmen, was aber klar ist, wenn die Nachricht fehlt. Dann ist nur PC-Name da, und da der glaubt er, das es sich wohl um eine Datei handeln muss.

    EDIT:
    Habe eben den Else-Zweig mal voreingestellt und es funktioniert. Es liegt wirklich daran, das die Nachricht nicht eingelesen wird. Aber wieso kann ich sie nicht einlesen?

    Total = Befehl + "Takeobase" + " " + "Hallo";
    


  • Was heißt hier "geht nicht"? Eventuell hast du ja vergessen, den eingegebenen Text an deine send() Funktion weiterzugeben (send() hat keine Parameter und greift auch nicht auf "test" zu, wo der String drinsteht).

    Ein anderer Punkt könnte sein, daß noch ein \n vom vorigen Eingabebefehl im Tastaturpuffer lauert - den mußt du natürlich per ignore() entsorgen, bevor du weiterliest.



  • Ich hab eben gegoogelt. Wie muss ich die ignore-function anwenden? hab nur was mit cin.ignore gefunden... da wartet der aber auf ne Eingabe.



  • Ja, cin.ignore() ist die richtige Funktion - der übergibst du als ersten Parameter eine relativ große Zahl (wenn du auf Nummer Sicher gehen willst: numeric_limits<int>::max()) und als zweiten Parameter '\n'. Dann holt cin so lange Zeichen aus dem Tastaturbuffer und entsorgt sie, bis es ein Newline erwischt.

    (und wenn du das unmittelbar vor deinem getline()-Aufruf machst, fällt auch niemandem auf, daß er warten muß)



  • Ich hab es jetzt so gemacht:

    cin.ignore( 1, '/n');

    Ist die Zahl höher, muss ich ewig ENTER durchweg drücken, damit er im Programm weiterläuft. Aber es funktioniert und das ist wichtig. Danke dir. Wusste nicht, das die Eingaben noch so lange im Speicher bleiben. Nochmal vielen Dank.


Anmelden zum Antworten