C Ein paar Fragen zu "sprintf"

12th Monkey

Cadet 3rd Year
Registriert
Feb. 2010
Beiträge
45
Ahoi CB'ler,

ich bins wiedermal mit einer Frage zu C. Undzwar habe ich eine Aufgabe in der mittels sprintf Befehl eine Zeichenkette ausgegeben werden soll (Schreiben der Länge von text1 mit sprintf in der Form Laenge1 = ... nach text3). Soweit so gut aber leider habe ich überhaupt nicht verstanden wie dieser "sprintf" aufgebaut ist...

Bisher sieht der entscheidende Schritt in etwa so aus:

Code:
int Laenge1; /*Um Laenge1 anzulegen*/

strcpy (text3, text1); /*um text1 in den Speicherplatz von text3 zu kopieren*/

Laenge1 = sprintf (text3, "Text3 ist %d Zeichen lang\n", text1); 
/*und hier das eigentliche Problem - ist der Ansatz so in Ordnung? Eigentlich soll damit ja die Zeichenanzahl ausgegeben werden aber in welcher Form das funktioniert habe ich nicht so richtig verstanden*/

Grüße
12th Monkey
 
Sieht doch gut aus.
Wo ist jetzt die Frage?
Was hast Du nicht verstanden?
sprintf (ziel, formatstring, argumente)
passt schon.
Wobei man das nicht macht, man verwendet snprintf, um ein Ueberlaufen des
Zieles zu vermeiden. Das sind die Sachen auf denen die Sicherheitsluecken meist basieren.
 
Was hast Du nicht verstanden?

Also nicht verstanden habe ich den eigentlichen Aufbau von sprintf. Ich kann es schlecht erklären deswegen ein Beispiel:

bei printf ist es so:
Code:
printf ("Text1 = %s", text1);
Der Teil zwischen den "" wird schriftlich ausgegeben, das %s ist ein Platzhalter und text1 ist der Wert der für %s eingesetzt wird.

Und sprintf sieht ja so aus:
Code:
Laenge1 = sprintf (text3, "Text3 ist %d Zeichen lang\n", text1);

Wofür steht hier der gesamte Teil in der Klammer? Und kann man "Laenge1 =" so verstehen, dass damit eine Operation à la Ergebnis = Zahl1 + Zahl2 angegeben wird?

Wobei man das nicht macht, man verwendet snprintf, um ein Ueberlaufen des
Zieles zu vermeiden.
Das wird in meiner Entwicklungsumgebung (Microsoft Visual Studio 2010) irgendwie nicht erkannt (wahrscheinlich weil der entsprechende Header fehlt)!?
 
Wenn man eine Methode nicht versteht, ist MSDN die erste Anlaufstelle (auch recht einfach über google zu erreichen)
 
Laenge1 wird der Return Wert der Funktion sprintf zugewiesen.
sprintf gibt (bei erfolgreichem Ablauf) die Anzahl der geschriebenen Character zurück.
 
Wenn man eine Methode nicht versteht, ist MSDN die erste Anlaufstelle (auch recht einfach über google zu erreichen)

Du wirst es nicht glauben aber auf diese Seite bin ich auch schon gestossen - sogar per google... Nur erklärt das meine Frage nicht!


Diese Seite habe ich auch schon entdeckt aber auch hier erklärt sich meine Frage nicht ausreichend.

Laenge1 wird der Return Wert der Funktion sprintf zugewiesen.

Ok damit ist schonmal eine Frage geklärt! Danke!

sprintf gibt (bei erfolgreichem Ablauf) die Anzahl der geschriebenen Character zurück.

Das ist mir schon klar aber WIE?
 
12th Monkey schrieb:
Das ist mir schon klar aber WIE?
Indem die Zeichen von text3 (der ja durch die Methode formatiert wurde) gezählt werden?
 
Bin ich jetzt nicht ganz sicher, was du nicht verstehst, aber versuchs nochmal ausführlicher.

Du musst dir die Programmabarbeitung so vorstellen: Der Computer sieht eine Zuweisung.
Laenge1 = sprintf (text3, "Text3 ist %d Zeichen lang\n", text1);

Wir wollen also der Variable Laenge1 einen Wert zuweisen. Dieser Wert ist aber noch unbekannt.
Also muss der Computer erstmal die sprintf Funktion mit den angegebenen Parametern starten.
Wenn sprintf fertig ist, gibt es die Anzahl der Character zurück, die es in text3 reingeschrieben hat. Ich nehm einfach mal 19 Character an.

Also steht dann anschließend dort:

Der return Wert ersetzt quasi den Funktionaufruf, wenn die Funktion fertig ist.

Das ist jetzt nur zur Veranschaulichung. Die Realität sieht natürlich noch etwas anders aus.
 
Wenn sprintf fertig ist, gibt es die Anzahl der Character zurück, die es in text3 reingeschrieben hat.

Ja das habe ich schon verstanden aber meine Frage ist WAS wird in text3 geschrieben durch diesen Befehl:

Code:
sprintf (text3, "Text3 ist %d Zeichen lang\n", text1);

Bzw. Was macht das text1 dort? Das ist mir noch weniger klar :(

Oder kann man das so verstehen, dass dort steht text3 = text1 und die Zeichenanzahl von text1 bzw. dem entstandenen text3 wird für %d eingesetzt?
 
Zuletzt bearbeitet:
sprintf macht im Prinzip nichts anderes als printf: Eine Zeichenkette formatieren. Aber hier wird der formatierte Text nicht zurückgegeben, sondern an die Adresse des 1. Parameters (text3) geschrieben. Die anderen beiden Parametern sind wie bei printf.

Soll in der Ausgabe wirklich stehen "Text3 ist XXX Zeichen lang\n"? Also ist das vorgegeben? Ich kann kein C aber ich bezweifle, dass das so möglich ist. "Text1 ist XXX Zeichen lang\n" wäre plausibler. Ob die Methode dann automatisch die Länge von text1 nimmt (da eine Zahl erwartet wird) oder die Adresse, oder ob das so überhaupt geht habe ich keine Ahnung . C ist einfach zu kompliziert für Anfänger.
 
Aber hier wird der formatierte Text nicht zurückgegeben, sondern an die Adresse des 1. Parameters (text3) geschrieben. Die anderen beiden Parametern sind wie bei printf.

Sehr gut genau das wollte ich wissen! Danke dir!

Soll in der Ausgabe wirklich stehen "Text3 ist XXX Zeichen lang\n"?

Ja soll es - aber text3 ist ja dann genausolang wie text1 bzw. soll ja text1 IN text3 geschrieben werden.

"Text1 ist XXX Zeichen lang\n" wäre plausibler.

Das ist ja das eigentlich das gleiche (zumindest vom Inhalt her sollte es das gleiche sein.

C ist einfach zu kompliziert für Anfänger.

Tja ein Semester lang muss ich da wohl leider trotzdem durch ;)

Ok ich glaube ich muss doch mal das ganze Programm posten es funktioniert nämlich nicht richtig (bzw. die Ausgabe stimmt nicht). Vielleicht liegt es an der Reihenfolge des Ablaufes!? Oder doch an dem sprintf Befehl!?

Code:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

	int main( void )	{


char text1[100] = "Hessen in Europa";
char text2[100] = "";
char text3[100] = "";
int Laenge1;
	

strcpy (text2, text1);
strcat (text2, " und der Welt");

	size_t laenge;
	laenge = strlen (text2);

strcpy (text3, text1);
Laenge1 = sprintf (text3, "%d", text1);

		printf ("Text1 = %s\nText2 = %s\n\n", text1, text2);
		printf ("Text2 ist %d Zeichen lang\n", laenge);
		printf ("Text1 ist in Text3 kopiert und %d Zeichen lang\n", Laenge1);
		
		printf ("%s\n", text3);

	printf("\n\nBitte Enter druecken um das Programm zu verlassen");
	getchar();

 return 0;

}
 
Zuletzt bearbeitet:
Code:
printf ("Text1 ist in Text3 kopiert und %d Zeichen lang\n", Laenge1);
Ah ha! Ich nehme mal an, du sollst text1 mittels und sprintf in text3 kopieren anstatt mit strcpy (und dann noch den Rückgabewert von sprintf anstatt sizeof nutzen).
Eigentlich recht einfach, wenn man den Unterschied zw. %d und %s kennt.

PS: Variablen wie "Laenge1" schreibt man klein.
 
Ah ha! Ich nehme mal an, du sollst text1 mittels und sprintf in text3 kopieren anstatt mit strcpy (und dann noch den Rückgabewert von sprintf anstatt sizeof nutzen).

Ja genau das ist das Ziel - dabei habe ich auch gerade schon einen Fehler entdeckt und laenge1 ist klein geschrieben. Das ganze sieht so aus (aber funktionieren tut es dennoch nicht):

Code:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

	int main( void )	{


char text1[100] = "Hessen in Europa";
char text2[100] = "";
char text3[100] = "";
int laenge1;
	

strcpy (text2, text1);
strcat (text2, " und der Welt");

	size_t laenge;
	laenge = strlen (text2);

laenge1 = sprintf (text3, "%d", text1);

		printf ("Text1 = %s\nText2 = %s\n\n", text1, text2);
		printf ("Text2 ist %d Zeichen lang\n", laenge);
		printf ("Text1 ist in Text3 kopiert und %d Zeichen lang\n", laenge1);
		
		printf ("%s\n", text3);

	printf("\n\nBitte Enter druecken um das Programm zu verlassen");
	getchar();

 return 0;

P.S.
%d steht für Dezimalwert einlesen/ ausgeben und %s für Zeichenkette einlesen/ ausgeben - also den Unterschied kenne ich aber was mit diesem (Halb-)Wissen anfangen?
 
Zuletzt bearbeitet:
Wenn du den Unterschied kennst, und du weißt, was du machen sollst, ergibt dann das hier einen Sinn?
Code:
sprintf (text3, "%d", text1);
Oder mit printf ausgedrückt:
Code:
printf ("%d", text1);
 
Wenn du den Unterschied kennst, und du weißt, was du machen sollst, ergibt dann das hier einen Sinn?

NEIN auf keinen Fall - Sorry - aber jetzt gerade habe ich den sprintf Befehl wirklich verstanden!

Code:
sprintf (text3, "%s", text1);

text3 steht für den Speicherplatz in den der durch den sprintf Befehl "enstehende" Wert gespeichert wird
%s ist der Platzhalter für die Zeichenkette
text1 ist der Wert der ausgelesen- und für s eingesetzt wird um ihn dann in text3 zu speichern

... Oder?
 
Schon getestet? ;)
 
Ja und sieht soweit gut aus - glaube ich :mussweg:

Aber kannst ja nochmal drüber schauen:

Code:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

	int main( void )	{


char text1[100] = "Hessen in Europa";
char text2[100] = "";
char text3[100] = "";
int laenge1;
	

strcpy (text2, text1);
strcat (text2, " und der Welt");

	size_t laenge;
	laenge = strlen (text2);
	laenge1 = sprintf (text3, "%s", text1);

		printf ("Text1 = %s\nText2 = %s\n\n", text1, text2);
		printf ("Text2 ist %d Zeichen lang\n", laenge);
		printf ("Text1 ist in Text3 kopiert und %d Zeichen lang\n\n", laenge1);
		
		printf ("Pruefung des Inhaltes von text3 = %s\n", text3);
		printf ("Pruefung des Inhaltes von text1 = %s\n\n", text1);

	printf("\n\nBitte Enter druecken um das Programm zu verlassen");
	getchar();

 return 0;

}
 
Wenns funktioniert is gut. Mehr kann ich aufgrund meines beschränkten Wissens über C nicht sagen.
 
Ach so - ja also meines Erachtens nach sind die Ausgaben richtig (wenn man die Buchstaben nachzählt kommt man auf die Anzahl die ausgegeben wird) und die Überprüfungen am Ende geben auch den richtigen Inhalt aus.

Danke nochmal an alle Beteiligten (und bis zum nächsten mal)!!! :daumen:
 
Zurück
Oben