Brauche Hilfe bei Pointern



  • Warum möchtest du denn noch den Pointer t haben?
    Den Ursprungswert von s brauchst du doch nicht mehr.

    Joe1903 schrieb:

    Inwiefern kann ich i und j zusammenfassen?Aber in diesem Bsp zählt i die Zeichen der Eingabe und j setzt den String zusammen.Kann man es trotzdem zusammenfassen?

    Wenn j>=lim-1 ist, dann gilt das auch für i

    Die Aufgabe von j (der Index im Array) übernimmt jetzt der Pointer.



  • DirkB schrieb:

    Warum möchtest du denn noch den Pointer t haben?
    Den Ursprungswert von s brauchst du doch nicht mehr.

    Joe1903 schrieb:

    Inwiefern kann ich i und j zusammenfassen?Aber in diesem Bsp zählt i die Zeichen der Eingabe und j setzt den String zusammen.Kann man es trotzdem zusammenfassen?

    Wenn j>=lim-1 ist, dann gilt das auch für i

    Die Aufgabe von j (der Index im Array) übernimmt jetzt der Pointer.

    Ist dann return s; ?



  • s ist vom Typ char* (ein Zeiger auf char)
    Dein Rückgabewert soll aber ein int sein.
    Die passen nicht zusammen.

    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)



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


Anmelden zum Antworten