Forum: PC-Programmierung sprintf, die nur MAX zeichen schreibt und dann NULL terminiert


von sprintf (Gast)


Lesenswert?

Moin,

ich suche eine snprintf_s - Funktion, die bei einer MAX Zahl von Zeichen 
das kopieren aufhört, den string NULL terminiert und weitermacht, aber 
keinen Programmabsturz verursacht.

Nach dem Wälzen der MSDN habe ich die abenteuerlichsten Formen gefunden, 
aber keine macht genau dies.

Weiss jemand von euch Rat?

von l0wside (Gast)


Lesenswert?

Deine Beschreibung klingt so, als würdest Du snprintf() suchen - aber 
das hast Du ja bereits erwähnt. Insofern verstehe ich Deine Frage nicht 
so recht.
1
int snprintf(char *str, size_t size, const char *format, ...)

"Writes output to the string str, under control of the format string 
format, that specifies how subsequent arguments are converted for 
output. It is similar to sprintf(3), except that size specifies the 
maximum number of characters to produce. The trailing nul character is 
counted towards this limit, so you must allocate at least size 
characters for str."

Gruß,

Max

P.S.: wie setzt man im Forum einen ganzen Absatz kursiv?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

l0wside schrieb:
> P.S.: wie setzt man im Forum einen ganzen Absatz kursiv?

Gar nicht. Es ist vom Forenbetreiber gewünscht, daß mit Textauszeichnung 
sparsam umzugehen ist.

von Mark B. (markbrandis)


Lesenswert?

l0wside schrieb:
> P.S.: wie setzt man im Forum einen ganzen Absatz kursiv?

Dafür gibt es hier leider keine vernünftige Lösung. Normalerweise macht 
man dafür ein Kursiv-Tag zu Beginn des Absatzes und ein schließendes 
Kursiv-Tag am Ende, und die Foren-Software wertet dies entsprechend aus.

Rufus Τ. Firefly schrieb:
> Gar nicht. Es ist vom Forenbetreiber gewünscht, daß mit Textauszeichnung
> sparsam umzugehen ist.

Wenn ich jetzt einen Absatz von gerade mal drei Zeilen kursiv machen 
will, und der Text ja normalerweise auch Satzzeichen enthält, dann muss 
ich für jede Zeile die Schrägstriche setzen und jedesmal wenn 
Interpunktion auftaucht nochmal extra. Ist dies wirklich eine 
vernünftige Lösung?

von DirkB (Gast)


Lesenswert?

NULL ist die Bezeichnung für einen ungültigen Zeiger.
Ein String wird mit dem Zeichen '\0' terminiert.

Letztendlich hat zwar beides den Wert 0, die Bedeutung ist jedoch 
unterschiedlich.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
> Ist dies wirklich eine vernünftige Lösung?

Wie ich schon schrieb:

> Es ist vom Forenbetreiber gewünscht, daß mit Textauszeichnung
> sparsam umzugehen ist.

Ganze Absätze, auch wenn sie nur drei Zeilen enthalten, fallen nicht 
mehr unter "sparsam".

Eine Möglichkeit, etwas deutlich als (nichtgrünes) Zitat hervorzuheben, 
sind die [prе][/prе]-Tags, dann muss man sich allerdings selbst um den 
Zeilenumbruch kümmern.

Das Beispiel hier sähe dann so aus:
1
int snprintf(char *str, size_t size, const char *format, ...)

1
Writes output to the string str, under control of the format string
2
format, that specifies how subsequent arguments are converted for
3
output. It is similar to sprintf(3), except that size specifies the
4
maximum number of characters to produce. The trailing nul character is
5
counted towards this limit, so you must allocate at least size
6
characters for str.

von hubert (Gast)


Lesenswert?

Mal zurück zum ursprünglichen Thema:

Es könnte sein, daß Du da über einen Bug in Visual Studio gestolpert 
bist.
http://stackoverflow.com/questions/2738260/false-sense-of-security-with-snprintf-s

von Random .. (thorstendb) Benutzerseite


Lesenswert?

ich habs gefunden:

Anstelle des zweiten MAX_CHAR parameters kann man _TRUNCATE angeben. 
Dann schnippelt der ab und macht ne NULL dran.

z.B.:
1
vsnprintf_s(buf, SIZE, _TRUNCATE, text, marker);
2
3
len = strlen(text);
4
pBuf2 = (char *) malloc (len * sizeof(char));
5
_snprintf_s(pBuf2, len,  _TRUNCATE, string, "1. Foo: %s", text);

Dummerweise "muss" man dann überall das len aus den malloc's ziehen, 
damit man das für die _s Varianten hat ...
Naja, der Sicherheit halber :-)

Thx!

von Random .. (thorstendb) Benutzerseite


Lesenswert?

btw ...
der aus dem Forum hats falsch gemacht:
1
char bytes[5];
2
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );

so müsste es aussehen:
1
char bytes[5];
2
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );

_TRUNCATE wird irgendwas a'la -1 oder so sein, eine "unmögliche Zahl" in 
diesem Kontext.
Natürlich muss man dem sprintf die bufSize mitgeben, sonst nutzt der 
_TRUNCATE nix (der in diesem Fall als bufSize interpretiert wurde...).


VG,
/th.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.