Kommentar Zentriert ausgeben



  • Hallo zusammen,

    ich komme mal direkt zu Sache.
    Ich wollte ein Programm schreiben dass einen Kommentar zenriert in einer 80 Zeichen langen Zeile ausgibt.

    Links sollen immer 10 Zeichen Platz sein, es gibt einen header und einen footer

    /******************************* -->Header
    *BLABLABLABLUBB KOmmentarBLABLA* -->Content
    *******************************/ -->Footer

    Header klappt
    footer auch
    Content nicht

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void sternchen(char*,char*);
    void zeilenbestimmen(int *,char*);
    void header(char*);
    void footer(char*);
    void printContent(char*,char*,int*);
    
    int main (void){
    
        char * cCommentDes = malloc(300);
        char * cCommentSou = malloc(300);
        char * cEndString  = malloc(1);
    
        int Zeilen;
    
                                          /*Strings mit '\0' initialiesieren*/
        cEndString[0] = '\0';
        cCommentDes[0] = '\0';
        cCommentSou[0] = '\0';
    
        cCommentSou = "Kommentar Etwas länger so dass es länger wird in der länge fghfgh sso fort  ich BILL Gates Anwalt ruft Bill an sagt Das Recht hat gesiegt BILL Antwortet Verdammte Scheisse wir gehen in Berufung";
    
                                  /* Anzahl der Zeilen bestimmen */
    
        zeilenbestimmen(&Zeilen,cCommentSou); 
    
        cEndString = realloc(cEndString, sizeof(char)*Zeilen*80 +1);  
    
        header(cEndString);
        printContent(cEndString, cCommentSou,&Zeilen);
        footer(cEndString);
    
        puts(cEndString);
    
        printf("%i\n",Zeilen);
        printf("%i\n",Zeilen * 80);
    
        system("pause");
    
        free(cCommentDes);
        free(cCommentSou);
        free(cEndString);
    
        return 0;
    
    }
    
    void zeilenbestimmen(int*Zeilen,char * cCommentDes)
    {
         *Zeilen = 2 ;  /*Zeilenanzahl auf 2 Setzen für Header und footer */
    
         (*Zeilen) += strlen(cCommentDes)/58;      /* Die Anzahl der Zeichen in 
                                                   einer Zeile sind 58 Zeichen*/
    
         if(strlen(cCommentDes) % 58 >0)
                     (*Zeilen)++;                  /* Hier wird geprüft ob noch eine Zeile 
                                                     hinzugefügt werden muss  */    
                     free(Zeilen);      
    }
    
    void header(char*CommentDes)
    {
         int i;
    
         for(i=0;i<10;i++)              /*10 whitespaces an den string klatschen danach sieht man ja
                                            */
             strcat(CommentDes," ");
    
         strcat(CommentDes,"/");      
    
         for(i=0;i<59;i++)
             strcat(CommentDes,"*");
    
         for(i=0;i<10;i++)
             strcat(CommentDes," ");
    
    }
    void footer(char*CommentDes)
    {
         int i;                     /* hier ist das Selbe wie im Header nur andersrum*/
    
         for(i=0;i<10;i++)
             strcat(CommentDes," ");
    
         for(i=0;i<59;i++)
             strcat(CommentDes,"*");
    
         strcat(CommentDes,"/");
    
         for(i=0;i<10;i++)
             strcat(CommentDes," ");
    
    }
    void printContent(char *CommentDes,char* CommentSou, int*Zeilen)
    {
         char temp;
    
         int i;     
    
         for(i=0;i<10;i++)
             strcat(CommentDes," ");
    
         strcat(CommentDes,"*");
    
                                                  /* ich überprüfe die länge des Source und des   
                                                     Quell Strings und dem String der den Fertigen
                                                     KOmmentar beinhalten soll*/
         printf("%i  %i  \n",strlen(CommentSou),strlen(CommentDes));
    
         for(i=0;i<58;i++)
         {
                          temp = *(CommentSou+i);    /* Ich spreche den Pointer als array an und kopiere 
                                                        den Kommentar in eine Temporäre Variable*/
    
          /*   CommentDes[strlen(CommentDes)+i] = temp ;*/ /* 1. Versuch die Temporäre Variable in den                                                       String zu kopieren */
    
                          printf("%c\n",temp);
    
              strcat(CommentDes," ");
    
             /* strcat(CommentDes,Temp) */               /* 2. Versuch */
    
          }    
         strcat(CommentDes,"*");
    
         for(i=0;i<10;i++)
              strcat(CommentDes," ");
    
              printf("%i  %i  \n",strlen(CommentSou),strlen(CommentDes));        
    }
    

    Das Programm lässt sich so wie es ist kompilieren die funktionen die ich eigentlich benutzen wollte in der funktion printContent sind auskommentiert

    Gruß

    Andre



  • Hallo reeporter,

    du hast in deinem Programm einige Fehler gemacht.
    Es ist mit Sicherheit sinnvoller, dir deine Fehler
    aufzuzeigen, aber ich habe mich entschieden, deinen
    Code so umzuschreiben, dass er funktioniert.

    Ich hoffe, du lernst aus dem neuen Code.

    Vielleicht solltest du dir mal in einem guten Buch
    die Kapitel Pointer und Pointerarithmetik anschauen.

    Hier nun der verbesserte Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void sternchen(char*,char*);
    int  zeilenbestimmen(char const*);
    void header(char*);
    void footer(char*);
    void printContent(char *, char const*, int);
    
    int main (void){
    
        char * cCommentDes = malloc(1300);
        char * cCommentSou = malloc(1300);
        char * cEndString;
    
        int Zeilen;
    
        memset(cCommentSou, 0x0, 1300);
        memset(cCommentDes, 0x0, 1300);
        cEndString = NULL;
    
        sprintf(cCommentSou, "Kommentar Etwas laenger so dass es laenger wird in der laenge fghfgh sso fort  ich BILL Gates Anwalt ruft Bill an sagt Das Recht hat gesiegt BILL Antwortet Verdammte Scheisse wir gehen in Berufung");
    
        /* Anzahl der Zeilen bestimmen */
        Zeilen = zeilenbestimmen(cCommentSou);
    
        cEndString = malloc(sizeof(char)*Zeilen*81 +1);
    
        memset(cEndString, 0x0, Zeilen*81+1);
        header(cEndString);
        printContent(cEndString, cCommentSou, Zeilen);
        footer(cEndString);
    
        puts(cEndString);
    
        free(cCommentDes);
        free(cCommentSou);
        free(cEndString);
    
        return 0;
    
    }
    
    int zeilenbestimmen(char const * cCommentDes)
    {
        int Zeilen = 2 ;  /*Zeilenanzahl auf 2 Setzen fuer Header und footer */
    
        /* Die Anzahl der Zeichen in einer Zeile sind 58 Zeichen*/
        Zeilen += strlen(cCommentDes)/56;
    
        /* Hier wird geprueft ob noch eine Zeile hinzugefuegt werden muss */
        if (strlen(cCommentDes) % 56 >0) Zeilen++;
    
        return Zeilen;
    }
    
    void header(char*CommentDes)
    {
        int i;
    
        for(i=0;i<10;i++) *(CommentDes++) = ' ';
        *(CommentDes++) = '/';
        for(i=0;i<59;i++) *(CommentDes++) = '*';
        for(i=0;i<10;i++) *(CommentDes++) = ' ';
        *(CommentDes++) = '\n';
    
    }
    
    void footer(char*CommentDes)
    {
        int i; /* hier ist das Selbe wie im Header nur andersrum */
    
        CommentDes = CommentDes+strlen(CommentDes);
        for(i=0;i<10;i++) *(CommentDes++) = ' ';
        for(i=0;i<59;i++) *(CommentDes++) = '*';
        *(CommentDes++) = '/';
        for(i=0;i<10;i++) *(CommentDes++) = ' ';
        *(CommentDes++) = '\n';
    }
    
    void printContent(char *CommentDes, char const* CommentSou, int zeilen)
    {
        char *temp;
    
        int i, j;
        unsigned int len = strlen(CommentSou);
    
        temp = CommentDes+81;
        for (i=0; i<zeilen-2; ++i) {
            sprintf(temp, "          * ");
            temp += 12;
    
            for (j=0; j<56; ++j) {
                if (len) {
                    *(temp++) = *(CommentSou++);
                    len--;
                } else {
                    *(temp++) = ' ';
                }
            }
            sprintf(temp, " *          \n");
            temp += 13;
        }
    
    }
    

    Und hier noch das Ergebnis:

    /***********************************************************          
              * Kommentar Etwas laenger so dass es laenger wird in der l *          
              * aenge fghfgh sso fort  ich BILL Gates Anwalt ruft Bill a *          
              * n sagt Das Recht hat gesiegt BILL Antwortet Verdammte Sc *          
              * heisse wir gehen in Berufung                             *          
              ***********************************************************/
    

    Ich habe nun auch am Ende jeder Zeile 10 Leerzeichen eingefügt. Das
    brauchst du nicht unbedingt, aber hat mir das Leben hier gerade
    einfacher gemacht.

    Und die Größe der Strings mit 1300 muss auch noch angepasst werden.

    Viel Spass damit
    mcr


Anmelden zum Antworten