Forschleife mit *p



  • Hallo, kann mir bitte jemand diese Forschleife erklären ?

    Irgendwie checke ich das nicht...
    was ich insbesondere nicht verstehe ist:
    for(p=str;*p;p++)

    kenne das halt nur ganz normal mit
    for(i=0;i <= 200;i++)

    und das zweite mit putchar(*p) verstehe ich auch nicht wirklich

    for(p=str;*p;p++)  
        {
             if(p==start[i])    //wenn p == start[i] dann....
             {
                 printf("\n");  //ausgabe \n ->naechste zeile
                 i++;           // i wird um eins erhoet i = i +1
             }
    
             putchar(*p);       
        }
    

    Wäre sehr dankbar, wenn mir das jemand mal erkälren könnte.

    Hier mal der Code des ganzen Programms:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(void) 
    {
        char str[100];      //Char-Array (wird auch C-String genannt) der groesse 100 
        char *start[100];   //Char-Array-Pointer der groesse 100
        char *p;            //Char-Pointer
        int i=0;            // integer i wird angelegt und 100 zugewiesen
    
        //mit strcpy wird der String "SonntagMontag...Samstag" in str reinkopiert
        strcpy(str, "SonntagMontagDienstagMittwochDonnerstagFreitagSamstag");
    
        start[0]=str;      //start[0] wird der C-String von str zugewiesen ("SonntagMontag...Samstag")                                                   
        start[1]=str+7;    //start[1] wird der C-String von str[7] zugewiesen ("MontagDienstag...Samstag")
        start[2]=str+13;   //start[2] wird der C-String von str[13] zugewiesen("DienstagMittwoch...Samstag")
        start[3]=str+21;   //start[3] wird der C-String von str[21] zugewiesen("MittwochDonnerstag...Samstag")
        start[4]=str+29;   //start[4] wird der C-String von str[29] zugewiesen("DonnerstagFreitagSamstag")
        start[5]=str+39;   //start[5] wird der C-String von str[39] zugewiesen("FreitagSamstag")
        start[6]=str+46;   //start[6] wird der C-String von str[46] zugewiesen("Samstag")
    
        for(p=str;*p;p++)  //for-schleife (zeiger p zeigt nun auf str;)
        {
             if(p==start[i])    //wenn p == start[i] dann 
             {
                 printf("\n");  //ausgabe \n ->naechste zeile
                 i++;           // i wird um eins erhoet i = i +1
             }
    
             putchar(*p);       // Gibt *p auf der Standardausgabe aus ????
    
        }
    
        printf("\n");
    
    //Bildschirmausgabe:
    //
    //Sonntag
    //Montag
    //Dienstag
    //Mittwoch
    //Donnerstag
    //Freitag
    //Samstag
    //
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • for(p=str;*p;p++)
    

    Am Anfang zeigt der Pointer auf den String str, genauer auf den ersten Buchstaben des Strings. *p ist immer der aktuelle Buchstabe, auf den der Zeiger zeigt. *p ist einfach eine Dereferenzierung. Wenn *p 0 ist, ist das Ende des Strings erreicht (Nullterminierungszeichen) und die Schleife wird abgebrochen. Mit p++ wird der Zeiger auf den Nächsten Buchstaben im String gesetzt. Zeiger enthalten ja Adressen, und diese kann man auch inkrementieren, dekrementieren, etc. Die Schleife durchläuft also den gesamten String.

    MfG, Jochen



  • achso...
    wenn ich das also richtig verstanden habe, dann steht am Ende des Strings ne "0" die zeigt, dass der String zu Ende ist.

    also so hier:

    [S][o][n][n][t][a][g][M][o][n][t][a][g][D][i][e][n][s][t][a][g][M][i][t][t][w][o][c][h][D][o][n][n][e][r][s][t][a][g][F][r][e][i][t][a][g][S][a][m][s][t][a][g][0]

    richtig ?

    also bekommt *p bei [0] ja ein false zurück und spring aus der schleife ?

    Schon mal ein Danke an dich 🙂



  • Eine Folge von Zeichen vom Typ char abgeschlossen von einem char mit Dezimalwert Null ('\0') nennt man in C String. Eine Folge von char benutzt man in C üblicherweise in der Form

    char[]
    

    bzw.

    char*
    

    Man kann selbstverständlich auch char Folgen ohne abschließendes '\0' verwenden, meist verlassen sich aber diverse Funktionen (insbesondere die mit 'str' im Namen) darauf, dass so ein Zeichen als Endekennzeichen vorliegt. Fehlt es, gibt es meist unschöne ungewollte Effekte.



  • Beachte aber das der Wert 0 und nicht das Zeichen '0' gemeint ist.

    printf("0:%i  '\\0':%i  '0':%i\n", 0, '\0', '0');
    

    ergibt

    0:0  '\0':0  '0':48
    

    Und "0" ist ein String aus 2 Zeichen: '0' und der Endkennung '\0'



  • Verwende im Kopf einer for-Schleife besser keine pointer wie *p und p++, wenn du nicht genau weisst, was da läuft!


Anmelden zum Antworten