006
03.11.2003, 20:10 Uhr
Pablo
Supertux (Operator)
|
Zitat: |
~sidejoe postete wobei ich das Gefühl nicht loswerde das wir es falsch verwenden:
|
Natürlich, ihr mischt C und C++ und das sollte man nicht tun, am besten wäre alles mit strings und die Funktionen von der STL benutzen, das macht die Sachen um einieges einfacher. Ich bin leider kein C++ Experte, deshalb benutze ich nur C, aber mischen tue ich nicht.
C++: |
int sprintf(char *str, const char *format, ...);
|
Sprintf macht im Prinzip dasselbe, was printf macht. Printf gibt in stdout (Bildschirm bei den meisten Rechnern) das aus, was man in const char* format übergibt. Da man auch Werte der Variablen mitgeben will, kann man diese Zeichenkette formatieren, z.b %d bedeutet dass da eine int Variable ausgegeben werden muss, und nach der Übergabe der Zeichenkette mit dem Format kommen die anderen Variablen, z.b:
C++: |
int z=9; printf("Hallo, World. Das ist mein Format und hier %d kommt eine Zahl.\n", z);
|
Die Ausgabe ist: Hallo, World. Das ist mein Format und hier 9 kommt eine Zahl
Nun, stell dir vor, ich will dasselbe ausgeben, aber nicht in stdout sondern in eine andere Variable von Typ char* bzw. char[]m dann nehme ich spriintf
C++: |
char kette[255]; int z=9; sprintf(kette, "Hallo, World. Das ist mein Format und hier %d kommt eine Zahl.\n", z);
|
Dann speichert kette die Zeichenkette: Hallo, World. Das ist mein Format und hier 9 kommt eine Zahl.
Wenn die Zeichenkette von Format größer als die Zeichenkette von kette, dann kann sein, dass du eine Segmentation Fault kriegst und das Programm beendet. Ich habe dieses Problem nie gehabt, weil ich mich darm gekümmrt hab, dass ich genügend Platz für die Zeichenkette habe.
Bearbeitung: |
Zitat: |
C++: |
case'J':strcpy(temph, " heigt=\"");strcpy(tempb, " width=\""); printf("Geben Sie die Hoehe in Pixeln ann"); cin >> h; printf("Geben Sie die Breite in Pixeln ann"); cin >> b; strcpy(mistzeichen2,"\""); strcpy(mistzeichen3,"\""); strcat(temph,h); strcat(tempb,b); strcat(endergebniss,temph); strcat(endergebniss,mistzeichen2); strcat(endergebniss,tempb); strcat(endergebniss,mistzeichen3);break;
|
|
Ich würde das zum Beispiel so machen:
C++: |
// angenommen: ich habe 2 Variablen befehel, bild // von typ: char befehl[4096], char bild[4096]; 2 Variabelen von typ int names height und width printf("Geben Sie den Pfad der Datei an: "); scanf("%s", bild); printf("Geben Sie die Höhe in Pixeln an: "); scanf("%d", &height); printf("Geben Sie die Breite in Pixeln an: "); scanf("%d", &width); // hier überprüfe nicht nach der Länge, ich setzte voraus, es gäbe genügend Platz. sprintf(befehl, "<img src=\"%s\" width=\"%d\" height=\"%d\">", bild, height, width);
|
Das ist meiner Meinung nach viel kompakter, lesbar und "fehlerfrei", ich habe eigentlich mich nicht um die Länge gekümmert, usw. d.h., wenn die Länge des Pfaades extrem lang, mehr als 4090 Zeichen lang ist, dann passiert Mist, usw.... deshlab "fehlerfrei", aber kompakter und lesbarer.
|
-- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 03.11.2003 um 20:20 Uhr von Pablo Yanez Trujillo editiert. |