sprintf, die nur MAX zeichen schreibt und dann NULL terminiert

Gast #2067208
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?
Gast #2067232
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?
#2067309
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?
Persönliche Seite #2067340
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.
Persönliche Seite #2067471
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!
Persönliche Seite #2067480
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren