probleme mit string



  • hi,
    es soll einer Funktion (send) ein String übergeben werden. Der vorher mit Eingaben gefüllt wird aber irgendwie glaub ich das der String leer ist, seht euch das mal bitte an vielleicht versteht jemand wo mein Fehler liegt und kann mir helfen.

    abfrage = true;
    
    string Eingabe(void)
    {
    
      string Eingabe;  
      char func_taste;
      if (abfrage)
      {
       cout << "Senden: ";
       abfrage = false;
       }
    
              if (kbhit()){
                  char Zeichen = func_taste = getch();
                  Eingabe += Zeichen;
                  cout << Zeichen;
    
              if (func_taste == 13)
              {        
                    send(s,Eingabe.c_str(),strlen(Eingabe.c_str()),0);
                    abfrage = true;
                       }
                  }
            return Eingabe;  
    }
    

    Danke für jede Hilfe

    MFG



  • Was genau, soll die Funktion machen?
    Du übergibst send immer nur ein Zeichen, nämlich char(13), was auch immer das ist.
    Das ist natürlich nicht sichtbar, da alle Zeichen kleiner als 32 Steuerzeichen sind.
    Was du wahrscheinlich machen willst, ist alle Zeichen in den String speichern und wenn du ein char(13) drückst, dann soll er gesendet werden.
    Dazu musst du aber alles in einer Schleife packen.

    abfrage = true;
    
    string Eingabe(void)
    {
      string Eingabe;  
      char func_taste;
      if (abfrage)
      {
        cout << "Senden: ";
        abfrage = false;
      }
      while ((func_taste = getch()) != 13) Eingabe += func_taste; // 13 wird nicht eingtragen
      Eingabe += func_taste; // jetzt wird noch das char(13) hinten angehängt
      cout << Eingabe;
      send(s,Eingabe.c_str(),strlen(Eingabe.c_str()),0);
      abfrage = true;
      return Eingabe;  
    }
    

    So macht das für mich nur Sinn.



  • imhotep schrieb:

    Du übergibst send immer nur ein Zeichen, nämlich char(13), was auch immer das ist.

    char(13) ist das Newline, auch bekannt als '\n' 😉

    Zu Optimierung wäre es übrigens noch günstiger, statt "strlen(s.c_tr())" gleich "s.size()" zu verwenden, die liefert das selbe Ergebnis, ohne den String nochmal durchscannen zu müssen.



  • ne ist es nicht es ist '\r', '\n' ist nämlich 10.
    Bei Windowsdateien ist das Zeilenende mit "\r\n" codiert.
    Zur Optimierung wäre es am besten gleich gets() zumachen, weil die eine ganze Zeile einliest.
    Oder man mach cin >> Eingabe, da wir hier ja anscheinend auch von C++ reden und getc/gets C ist.

    --------------------
    Keep on smiling 😃



  • imhotep schrieb:

    Zur Optimierung wäre es am besten gleich gets() zumachen, weil die eine ganze Zeile einliest.

    bloß kein gets verwenden! da gibt es nämlich keine überprüfung, ob der buffer schon voll ist. da ist std::istream::getline() bzw. std::getline() aus <string> besser.



  • abfrage = true;
    
    void Eingabe(void)
    {
    
      string Eingabe;  
      char func_taste, Zeichen;
      if (abfrage)
      {
       cout << "Senden: ";
       abfrage = false;
       }
    
              if (kbhit()){
                  char Zeichen = func_taste = getch();
                  Eingabe += Zeichen;
                  cout << Zeichen;
    
              if (func_taste == 13)
              {        
                    send(s,Eingabe.c_str(),strlen(Eingabe.c_str()),0);
                    abfrage = true;
                       }
                  }
    
    }
    

    So erstmal das ist eine Funktion die in einer Schleife läuft mit dem char func_taste prüfe ich ob die Enter Taste gedrückt wurde, ist dies der Fall soll der String der vorher gefüllt wurde der Funktion (send) übergeben werden. Ich will immer nur ein Zeichen einlesen damit das Programm während des einlesens nicht stehen bleibt sondern in der Hauptschleife weiterläuft da fällt std::cin schon mal aus und auch getline() müsste blockieren wenn mich nicht alles irrt damit bin ich mir nicht sicher aber das wollte ich eigentlich nicht wissen kann mir jemand sagen warum der string Eingabe leer ist wenn er es denn ist.



  • So was hatte ich mir fast dacht, dass du extern eine Schleife laufen lässt.
    Was deine Funktion trotzdem falsch macht, ist, dass sie immer nur ein Zeichen sendet, denn Eingabe wird bei Beginn der Funktion erzeugt und nach dem Beenden gelöscht.
    Entweder du machst Eingabe global, so wie abfrage oder, was mir besser gefallen würde, du über gibst es an die Funktion (am besten als Referenz). Dann musst du Eingabe nach dem senden leeren.



  • imhotep schrieb:

    So was hatte ich mir fast dacht, dass du extern eine Schleife laufen lässt.
    Was deine Funktion trotzdem falsch macht, ist, dass sie immer nur ein Zeichen sendet, denn Eingabe wird bei Beginn der Funktion erzeugt und nach dem Beenden gelöscht.
    Entweder du machst Eingabe global, so wie abfrage oder, was mir besser gefallen würde, du über gibst es an die Funktion (am besten als Referenz). Dann musst du Eingabe nach dem senden leeren.

    Okay selbst wenn ich Eingabe global mache läuft es nicht Eingabe bleibt bei der übergabe trotzdem leer



  • könnte sich nochmal bitte jemand mein problem ansehen



  • Alexander Heit schrieb:

    void Eingabe(void)
    {
      string Eingabe;
      //...
    

    Daß dein Compiler das anstandslos schluckt? Erstaunlich.

    Ansonsten solltest du nicht die "bool abfrage" global verfügbar machen, sondern den String mit den gespeicherten Daten:

    string in_text;bool abfrage;
    void Eingabe()
    {
      char Zeichen;//wozu du zwei Variablen für den selben Inhalt brauchst, ist mir schleierhaft
      if(abfrage)
      {
        cout << "Senden: ";
        abfrage = false;
      }
    
      if(kbhit()){
        Zeichen = getch();
        in_text += Zeichen;
        cout << Zeichen;
    
        if (func_taste == 13)
        {        
          send(s,in_text.c_str(),strlen(in_text.c_str()),0);
        }
      }
    }
    
    int main()
    {
      //...
      abfrage=true;
      do
      {
        Eingabe();
        if(abfrage) in_text="";
      } while(!ende())
    }
    

Anmelden zum Antworten