C: Variable Argumentlisten

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Gutschy, 31. August 2016 .

Schlagworte:
  1. 31. August 2016
    Hallo Leute,

    hänge beim Verständnis eines kurzen Skripts voll durch.
    Code:
    /* strxcat.c */
    #include <stdio.h>
    #include <stdarg.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX 50
    
    void strxcat(int n_strings, ...) {
     va_list zeiger;
     char *quelle, *ziel, *p;
    
     va_start(zeiger,n_strings);
     /* nun auf den Zielstring */
     ziel = va_arg(zeiger,char *);
     p = ziel;
     /* am Ende vom Zielstring */
     ziel+=strlen(ziel);
     if( (ziel-p) > MAX) {
     printf("!!!Maximale Anzahl an Zeichen ueberschritten!!!\n");
     return;
     }
     while(--n_strings > 0) {
     /* Quelle einlesen */
     quelle = va_arg(zeiger, char *);
     /* jetzt Zeichen für Zeichen an ziel */
     while(*quelle) {
     *ziel++ = *quelle++;
     if( (ziel-p) > MAX) {
     printf("!Maximale Anzahl an Zeichen ueberschritten!\n");
     exit(EXIT_FAILURE);
     }
     }
     }
     *ziel = '\0';
    }
    
    int main(void) {
     char string[MAX] = "Test : ";
     char string2[] = " Und";
    
     strxcat(3, string, "hallo " , "welt");
     printf("%s\n",string);
    
     strxcat(5, string, string2, " noch", " ein", " Test");
     printf("%s\n",string);
    
     /*Und nun ein Fehler mit Absicht*/
     strxcat(4, string , " Ueberlauf", " von", " MAX");
     printf("%s\n",string);
     return EXIT_SUCCESS;
    }
    
    
    Es geht mir dabei um die Zeile:

    *ziel++ = *quelle++;

    Irgendwie macht es für mich anders mehr Sinn:
    *ziel = *quelle++;

    Vielleicht kann mir das jemand kurz erklären.

    Gruss,

    gutschy
     
  2. 31. August 2016
    AW: C: Variable Argumentlisten

    Das * deutet auf einen Pointer hin, dieser besteht nur aus einer Adresse, an welcher Daten gespeichert sein können.

    Das läuft also so ab, das die Adresse der quelle in den ziel pointer gespeichert wird und anschließend das ++ durchgeführt wird was beide Zeiger (Pointer) deren enthaltene Adresse hochzählt und damit auf das nächste "Zeichen" zeigt.

    Er spart sich praktisch eine eine Zeile Code (ziel++ und quelle++ extra)


    Ka ob das stimmt, ich hab seit 10 Jahren kein C++ mehr gemacht
     
  3. 1. September 2016
    AW: C: Variable Argumentlisten

    Ahhh, danke raid-rush, es wierd erst der Zeiger übertragen und dann wird hochgezählt.
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.