Brauche Hilfe bei Pointern



  • DirkB schrieb:

    s ist vom Typ char* (ein Zeiger auf char)
    Dein Rückgabewert soll aber ein int sein.
    Die passen nicht zusammen.
    ws
    Und nochmal selber überlegen:
    Welchen Wert möchtest du zurück geben?
    (bitte einen vollständigen Satz, danach kannst du die Variable/Berechnung nennen, die diesen Wert hat)

    Ich möchte die Anzahl der Zeichen der Eingabe zurückgeben.



  • Joe1903 schrieb:

    Ich möchte die Anzahl der Zeichen der Eingabe zurückgeben.

    In welcher Variable ist der Wert abgelegt?



  • DirkB schrieb:

    Joe1903 schrieb:

    Ich möchte die Anzahl der Zeichen der Eingabe zurückgeben.

    In welcher Variable ist der Wert abgelegt?

    In i

    Mich hat auch durcheinander gebracht,dass beim Bsp

    return s-t;

    stand.



  • Joe1903 schrieb:

    Mich hat auch durcheinander gebracht,dass beim Bsp

    return s-t;

    Der Code macht ja auch etwas anderes.

    Was ist s, was ist t, wie sind die Werte davon. Was ist die Differenz daraus.
    t zeigt auf den Anfang, s auf das Ende, die Differenz ist die Länge des Strings.
    Dadurch kann auf eine weitere Zählvariable verzichtet werden.



  • DirkB schrieb:

    Joe1903 schrieb:

    Mich hat auch durcheinander gebracht,dass beim Bsp

    return s-t;

    Der Code macht ja auch etwas anderes.

    Was ist s, was ist t, wie sind die Werte davon. Was ist die Differenz daraus.
    t zeigt auf den Anfang, s auf das Ende, die Differenz ist die Länge des Strings.
    Dadurch kann auf eine weitere Zählvariable verzichtet werden.

    Ok,langsam verstehe ich.Inwiefern kann ich bei meinem Code Zeigerarithmetik anwenden?Auf dieselbe Art oder?Wäre sowas dann richtig?

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

    Würde dann auch die Länge des Strings zurückgegeben werden?



  • Nein.

    1. Wieviel Befehle gehören nach einer if/for/while/ Anweisung?
    Einer!
    Wenn du mehr willst, musst du diese durch Klammerung zu einem Block zusammen fasssen. (Achte auf den Scope)
    Z.Zt. ist deine Einrückung falsch.

    2. Nochmal deine Worte:

    Joe1903 schrieb:

    Ich möchte die Anzahl der Zeichen der Eingabe zurückgeben.

    s-t ist aber die Anzahl der Zeichen im String.
    Das ist der Unterschied, den du unbedingt haben wolltest, und der auch mehrmals nachgefragt wurde.

    Joe1903 schrieb:

    Ok,langsam verstehe ich.

    Nein, tust du nicht.

    Joe1903 schrieb:

    Inwiefern kann ich bei meinem Code Zeigerarithmetik anwenden?

    Bis auf das Postinkrement, gar nicht. Brauchst du nicht.



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


Anmelden zum Antworten