Brauche Hilfe bei Pointern



  • Furble Wurble schrieb:

    So steht's bei K&R:

    /* getline: read a line into s, return length
     */
    int getline_kr(char s[],int lim)
    {
      int c, i;
      for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
      if (c == '\n') {
        s[i] = c;
        ++i;
      }
      s[i] = '\0';
      return i;
    }
    

    Du könntest jetzt Z. 3 ersetzen durch

    int getline_kr(char *s,int lim)
    

    und wärst fertig.

    Unsinn.

    int getline_kr(char s[],int lim)
    int getline_kr(char *s,int lim)
    

    sind in jeglicher Hinsicht identisch.



  • Th69 schrieb:

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

    Einspruch! Das ist nicht das Selbe.

    Ersteres ist ein Pointer auf {'T','e','s','t','\0'}, das üblicherweise in einem schreibgeschützten Bereich gespeichert ist.
    Letzteres ist ein Array aus 5 Zeichen, das mit {'T','e','s','t','\0'} initialisiert wird und dessen Inhalt auch verändert werden kann.

    Probier doch mal:

    char *a = "Test";
    char b[] = "Test";
    
    printf ("%p %p\n", a, &a);  // unterschiedliche werte. dereferenzierung klappt
    printf ("%p %p\n", b, &b);  // 2 mal gleicher wert, dereferenzierung nicht möglich
    


  • Wutz schrieb:

    Furble Wurble schrieb:

    So steht's bei K&R:

    /* getline: read a line into s, return length
     */
    int getline_kr(char s[],int lim)
    {
      int c, i;
      for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
      if (c == '\n') {
        s[i] = c;
        ++i;
      }
      s[i] = '\0';
      return i;
    }
    

    Du könntest jetzt Z. 3 ersetzen durch

    int getline_kr(char *s,int lim)
    

    und wärst fertig.

    Unsinn.

    int getline_kr(char s[],int lim)
    int getline_kr(char *s,int lim)
    

    sind in jeglicher Hinsicht identisch.

    So würde es für den obigen Code aussehen:

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

    Aber wie sieht es für meinen modifizierten Code aus?

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

  • Mod

    Ich verstehe nicht, was du wissen möchtest. Besteht immer noch Unklarheit zu Pointern und Arrays? Wurde schon alles 3x erklärt.

    Willst du wissen, wieso dein modifizierter Code nicht funktioniert? Der compiliert nicht einmal, die Syntaxhervorhebung im Forum zeigt dir warum.



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


Anmelden zum Antworten