Brauche Hilfe bei Pointern



  • Den Test auf EOF kann man bei getchar() eigentlich auch weglassen. Ausser man will explizit auf CTRL-Z (oder CTRL-D?) reagieren.


  • Mod

    Andromeda schrieb:

    Den Test auf EOF kann man bei getchar() eigentlich auch weglassen. Ausser man will explizit auf CTRL-Z (oder CTRL-D?) reagieren.

    So? Worauf würdest du denn testen? Nur auf '\n'? Herzlichen Glückwunsch, nun versagt dein Programm bei Schluss des Streams.



  • SeppJ schrieb:

    Andromeda schrieb:

    Den Test auf EOF kann man bei getchar() eigentlich auch weglassen. Ausser man will explizit auf CTRL-Z (oder CTRL-D?) reagieren.

    So? Worauf würdest du denn testen? Nur auf '\n'? Herzlichen Glückwunsch, nun versagt dein Programm bei Schluss des Streams.

    Okay, wenn man stdin umbiegt kommt das vor.
    Aber von der Tastatur kommt kein EOF, ausser man sendet es bewusst mit CTRL, oder?


  • Mod

    Andromeda schrieb:

    SeppJ schrieb:

    Andromeda schrieb:

    Den Test auf EOF kann man bei getchar() eigentlich auch weglassen. Ausser man will explizit auf CTRL-Z (oder CTRL-D?) reagieren.

    So? Worauf würdest du denn testen? Nur auf '\n'? Herzlichen Glückwunsch, nun versagt dein Programm bei Schluss des Streams.

    Okay, wenn man stdin umbiegt kommt das vor.
    Aber von der Tastatur kommt kein EOF, ausser man sendet es bewusst mit CTRL, oder?

    Also so ungefähr 100% der Zeit, wenn man Ende der Eingabe signalisieren will?

    Du bist echt ein Schönwetterprogrammierer.



  • SeppJ schrieb:

    Andromeda schrieb:

    SeppJ schrieb:

    Andromeda schrieb:

    Den Test auf EOF kann man bei getchar() eigentlich auch weglassen. Ausser man will explizit auf CTRL-Z (oder CTRL-D?) reagieren.

    So? Worauf würdest du denn testen? Nur auf '\n'? Herzlichen Glückwunsch, nun versagt dein Programm bei Schluss des Streams.

    Okay, wenn man stdin umbiegt kommt das vor.
    Aber von der Tastatur kommt kein EOF, ausser man sendet es bewusst mit CTRL, oder?

    Also so ungefähr 100% der Zeit, wenn man Ende der Eingabe signalisieren will?

    Das mache ich mit der Return-Taste (Windows).

    Probier mal das:

    int main()
    {
        while (1)
        {
           int c = getchar();
           if (c == EOF)
              printf ("EOF!\n");
           else if (c == '\n')
              printf (".\n");
           else
              printf ("%c", c);
        }
    }
    

    Tippe etwas ein und schließe mit Return ab.
    Bei mir jedenfalls kommt kein EOF. 🙂


  • Mod

    🙄

    Wie zeigst du an, dass du fertig bist mit dem Eingeben der Zeilen? Wie lange läuft das Programm, was ist die Abbruchbedingung? EOF, oder?

    Oder bist du so einer, bei dem man ein Programm nur mit CTRL+C abbrechen kann? Schönwettwerprogrammierer.



  • Hm...

    Ich raff grad nicht, wie es möglich sein kann, dass stdin oder auch std::cin irgendwann mal das Ende des Streams erreicht ohne den State selber zu setzen.
    Wann also ist ein Eingabestrom zu ende?



  • SeppJ schrieb:

    🙄
    Wie zeigst du an, dass du fertig bist mit dem Eingeben der Zeilen? Wie lange läuft das Programm, was ist die Abbruchbedingung?

    Eine solche ist in dem kleinen Testprogrämmchen nicht vorgesehen. Ich schließe einfach das Console-Window, wenn ich es nicht mehr brauche.

    Man kann dieses Miniprogramm selbstverständlich beliebig erweitern. Z.B. indem man auf ein bestimmtes Zeichen oder Schlüsselwort reagiert, um es zu beenden.

    Aber taucht bei dir nun ein EOF auf oder nicht?
    Es kann doch sein, dass du ein anderes OS benutzt, das EOF statt \n sendet, wenn du Return drückst.



  • dieNull schrieb:

    Hm...

    Ich raff grad nicht, wie es möglich sein kann, dass stdin oder auch std::cin irgendwann mal das Ende des Streams erreicht ohne den State selber zu setzen.
    Wann also ist ein Eingabestrom zu ende?

    Du kannst stdin umleiten, z.B. indem es aus einer Datei liest. Dann sollte ein EOF kommen, wenn getchar() das Ende der Datei erreicht hat.



  • Andromeda schrieb:

    Du kannst stdin umleiten, z.B. indem es aus einer Datei liest. Dann sollte ein EOF kommen, wenn getchar() das Ende der Datei erreicht hat.

    Ok. Und wenn man das nicht tut? Also wenn man stdin oder std::cin einfach nur so benutzt um was einzulesen, ist er dann ab einer bestimmten Größe am Ende? Oder ist es dann endlos?



  • dieNull schrieb:

    Ok. Und wenn man das nicht tut? Also wenn man stdin oder std::cin einfach nur so benutzt um was einzulesen, ist er dann ab einer bestimmten Größe am Ende? Oder ist es dann endlos?

    Also ich habe bisher nur erlebt, dass man mit mit CTRL-Z ein EOF in den Stream schubsen kann. Wenn man nicht darauf reagiert, läuft das Programm weiter. Stdin ist also weiterhin aktiv.

    Vielleicht muss man erst den Tastaturtreiber im laufenden Betrieb disablen, damit ein EOF erscheint? Das habe ich noch nicht ausprobiert. 😃


  • Mod

    Man kann in einer Konsole einen Eingabestream von der Tastatur schließen, indem man CTRL+Z bzw. CTRL+D drückt. Fertig. Nichts geheimnisvolles dran, sämtliche Spekulationen über Tastaturpuffer, Größe der Daten, usw. sind Unsinn.

    Das ist auch die normale Art, einem Konsolenprogramm bei Tastatureingabe das Ende zu signalisieren, aber anscheinend weiß niemand mehr, wie man Computer bedient.

    Andromeda schrieb:

    Ich schließe einfach das Console-Window, wenn ich es nicht mehr brauche.

    Großartig. Ich mach immer kill -9 , wenn ich ein Programm beenden möchte.



  • SeppJ schrieb:

    Das ist auch die normale Art, einem Konsolenprogramm bei Tastatureingabe das Ende zu signalisieren, aber anscheinend weiß niemand mehr, wie man Computer bedient.

    Wenn man aus der Unix-Ecke kommt, findet man das bestimmt normal. Du verwendest bestimmt auch Vim gerne.

    Ick als KlickiBunti-Freund, habe ein etwas anderes Verhältnis zu Konsolen-Programmen. 🙂



  • Andromeda schrieb:

    Ick als KlickiBunti-Freund, habe ein etwas anderes Verhältnis zu Konsolen-Programmen. 🙂

    Naja, solange man die Möglichkeit hat, ein Programm so zu programmieren, dass der User es auch beenden kann, sollte man das auch tun. Wie man nun schlussendlich das Programm beendet ist ja eigentlich egal. Bei meinem Sniffer mach ich jedoch eine Endlosschleife. Ich könnte vielleicht noch ein Signal Handler dazu einbauen, das einfach noch ein "Programm beendet" ausgibt, wenn man CTRL+C drückt.



  • Wutz schrieb:

    Th69 schrieb:

    char *s = "Test";
    // alternativ: char[] s = "Test"
    

    Unsinn. Da ist nichts alternativ. Das sind grundsätzlich unterschiedliche Definitionen.

    Ich meinte natürlich

    char s[] = "Test";
    

    😉
    Und mit "alternativ" meinte ich auch nicht, daß die beiden Definitionen gleich sind, sondern daß für beide Definitionen der darunterstehende Code so funktioniert (und die gleiche Ausgabe liefert, s. http://ideone.com/Q9xj4X )!



  • Ich hab folgendes versucht aber funktioniert nicht bzw aber der Rückgabewert ist nur die Länge des Strings bis lim.Was muss ich ändern damit die Länge des Strings zurückgegeben wird,auch wenn es lim übersteigt?

    int mgetline(char *s,int lim)
    {
       int c;
       char *t=s;
    
       while (c=getchar() != EOF && c != '\n')
       {
          if (--lim>0)
          {
             *s++=c;
          }
       }
    
       if (c == '\n')
       {
          if (--lim>0)
          {
             *s++=c;
          }
       }
    
       *s = '\0';
    
       return s-t;
    }
    


  • Joe1903 schrieb:

    Ich hab folgendes versucht aber funktioniert nicht bzw aber der Rückgabewert ist nur die Länge des Strings bis lim.

    Mir ist so, als hätte ich das schon erwähnt.

    Joe1903 schrieb:

    Was muss ich ändern damit die Länge des Strings zurückgegeben wird,auch wenn es lim übersteigt?

    Auch das hatte ich schon erwähnt. Zähle die Zeichen mit einer extra Variablen. Du könntest sie i nennen (obwohl es bessere Namen gibt).



  • Joe1903 schrieb:

    Ich hab folgendes versucht aber funktioniert nicht bzw aber der Rückgabewert ist nur die Länge des Strings bis lim.Was muss ich ändern damit die Länge des Strings zurückgegeben wird,auch wenn es lim übersteigt?

    int mgetline(char *s,int lim)
    {
       int c;
       char *t=s;
    
       while (c=getchar() != EOF && c != '\n')
       {
          if (--lim>0)
          {
             *s++=c;
          }
       }
    
       if (c == '\n')
       {
          if (--lim>0)
          {
             *s++=c;
          }
       }
    
       *s = '\0';
    
       return s-t;
    }
    

    Probier mal den. Zeichen reinhacken und hin und wieder return drücken. Und dann sagen, ob es passt oder nicht. 🙂

    int mgetline (char *s, unsigned lim)
    {
        char *t=s;
    
        while(1)
        {
            int c = getchar();
            lim--;
            if (c == '\n' || lim == 0)
                break;
            *s++ = (char)c;
        }
        *s = 0;
        return (int)(s-t);
    }
    
    int main()
    {
        char test[16];
        for (;;)
        {
            int len = mgetline (test, 10);
            printf ("%s, length: %d\n", test, len);
        }
    }
    


  • Ich hab eine andere Frage zu Arrays aber zu einem anderen Code.
    Muss ich hierfür einen neue Diskussion öffnen?



  • Joe1903 schrieb:

    Ich hab eine andere Frage zu Arrays aber zu einem anderen Code.
    Muss ich hierfür einen neue Diskussion öffnen?

    Ja bitte.


Anmelden zum Antworten