Brauche Hilfe bei Pointern



  • Meine Frage ist wie würde mein modifizierter Code mit Pointern aussehen?
    Ich krieg es nicht richtig hin und möchte wissen,wie es aussehen würde,damit ich es verstehe



  • DU NUTZT SCHON POINTER1111



  • Ich weiß aber nicht genau wie ich wie in meinem Fall mit 2 Variablen mache.Bzw. kann jemand ein Bsp geben anhand des mod. Codes?Kann jemand wenn auch nur die for-Schleife den mod. Code so schreiben wie im dem Bsp dass ich gepostet habe??



  • Er möchte von der Arrayschreibweise a[] weg zur Pointerschreibweise *a.
    Warum auch immer.

    Statt s[j++]=c; schreibst du *s++=c;j++; ⚠ Achte auf den Scope
    Statt s[j] schreibst du *s

    ⚠ Das gilt aber nur hier in diesem Beispiel.

    Du könntest noch i und j zusammenfassen.



  • Danke.
    Und wie ist der Unterschied bei der Initialiserung?In dem Originalcode macht man ja
    char *t=s;

    Mach ich dann
    char *t=s;
    int c,j;

    ?

    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?



  • DirkB schrieb:

    Er möchte von der Arrayschreibweise a[] weg zur Pointerschreibweise *a.
    Warum auch immer.

    Statt s[j++]=c; schreibst du *s++=c;j++; ⚠ Achte auf den Scope
    Statt s[j] schreibst du *s

    ⚠ Das gilt aber nur hier in diesem Beispiel.

    Du könntest noch i und j zusammenfassen.

    Danke.
    Und wie ist der Unterschied bei der Initialiserung?In dem Originalcode macht man ja
    char *t=s;

    Mach ich dann
    char *t=s;
    int c,j;

    ?

    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?



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


Anmelden zum Antworten