www.mikrocontroller.net

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


Autor: sprintf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: l0wside (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: DirkB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-s...

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.:
vsnprintf_s(buf, SIZE, _TRUNCATE, text, marker);

len = strlen(text);
pBuf2 = (char *) malloc (len * sizeof(char));
_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!

Autor: Random ... (thorstendb) Benutzerseite
Datum:

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

so müsste es aussehen:
char bytes[5];
_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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.