Verwirrung um das kopieren von Pointern



  • Hallo zusammen,

    wenn ich die C-Programming language richtig verstehe, bedeutet der Ausdruck

    p = q
    

    wobei p und q Pointer sind, dass p nun ebenfalls auf das Element zeigt, auf das q zeigt.

    O-Ton C Programming Language:

    For example, if iq is another pointer to int, iq = ip copies the contents of ip into iq, thus making iq point to whatever ip pointed to. (Section 5.1, letzte Zeile)

    .

    Bei diesem Code habe ich jedoch ein Problem:

    int i = 0;
      while((ret = cursorp->get(cursorp, &key, &data, DB_PREV)) == 0 && i < 10){
          buffer = data.data;
          blogpost.stru_header = buffer;
          blogpost.stru_entry = buffer + 13;
    
          if (strncasecmp (blogpost.stru_header, entry_headerbuffer, 10) != 0){
            printf("<h3>%s</h3><br/>\n", blogpost.stru_header);
          }
    
          printf("<li><A HREF=\"?e%s\">[l]</A> %s<br/>\n", key.data, blogpost.stru_entry);
    
          entry_headerbuffer = blogpost.stru_header;
          i++;
        }
    

    Die while Schleife wird durchlaufen. Pro Durchlauf wird ein Tuppel aus der Datenbank ausgelesen. Wenn der Wert "entry_headerbuffer" gleich ist, wie der "entry_headerbuffer" vom vorherigen Eintrag, soll nichts passieren. Sonst die printf-Funktion

    printf("<h3>%s</h3><br/>\n", blogpost.stru_header);

    aufgerufen werden.

    Problem:
    Wenn ich

    entry_headerbuffer = blogpost.stru_header;

    übergebe, ist entry_headerbuffer bei der nächsten Iteration der Schleife == blogpost.stru_header. Dies darf, um einen Stringvergleich zu gewährleisten, nicht der Fall sein.

    Meine Fragen:
    a) Wie ist der Eintrag der C Programming Language richtig zu verstehen?
    b) Wie umgehe ich das Problem am besten?

    Besten Dank!

    Jan



  • jAIk schrieb:

    Wenn ich

    entry_headerbuffer = blogpost.stru_header;

    übergebe, ist entry_headerbuffer bei der nächsten Iteration der Schleife == blogpost.stru_header. Dies darf, um einen Stringvergleich zu gewährleisten, nicht der Fall sein.

    ich verstehe nicht wirklich, was du damit meinst. Du übergibst was, wem?



  • Hi,

    ich erkläre das mal etwas ausführlicher:

    Der Code ist Teil eines CGIs.

    Ein char *buffer enthält z.B. folgenden string bei Iteration 1:

    Sat, 10. Nov\0Hallo Welt\0
    

    Dieser Eintrag wird über

    buffer = data.data;
    blogpost.stru_header = buffer;
    blogpost.stru_entry = buffer + 13;
    

    in die struct blogpost geschrieben.

    Die printf-Ausgabe könnte also unter Verwendung von blogpost.stru_header und blogpost.stru_entry folgendes erzeugen:

    Sat, 10. Nov
    Hallo Welt
    

    Da ich jedoch in diesem Fall das "Sat, 10. Nov" nicht über jedem Eintrag separat stehen haben möchte, sondern in der Form:

    Sat, 10. Nov
    Hallo Welt
    Eintrag 2
    Eintrag 3
    ...
    
    Sun, 11. Nov
    Foo bar
    

    Nun habe ich eine char *entry_headerbuffer erstellt, welche den blogpost.stru_header, also "Sat, 10.Nov" zwischenspeichern soll, um bei der nächsten Iteration zu prüfen, ob der Eintrag identisch zum vorherigen ist, oder ob blogpost.stru_header nun z.B. "Sun, 11.Nov" ist.

    Sollten noch Fragen offen sein stehe ich gerne zur Verfügung!

    Lg

    Jan



  • Wieso vergleichst du nicht direkt die Adressen, auf die die beiden Pointer zeigen?

    Etwa so:

    if (blogpost.stru_header != entry_headerbuffer) {
            printf("<h3>%s</h3><br/>\n", blogpost.stru_header);
    }
    

    MfG


Anmelden zum Antworten