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
*******************************/ -->FooterHeader 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