Nachkommastellen
-
sprintf() ist aber gefährdet gegenüber Buffer overflows. Gibts da für C keine Alternative?
mfg
-
Jeffson schrieb:
sprintf() ist aber gefährdet gegenüber Buffer overflows. Gibts da für C keine Alternative?
mfg
nicht wenn man sprintf richtig benutzt.
und achja, modf http://www.cplusplus.com/reference/clibrary/cmath/modf/ liefert u.a. den nachkommaanteil.
-
Willst du die Anzahl der Nachkommastellen wissen oder den Wert?
Jeffson schrieb:
sprintf() ist aber gefährdet gegenüber Buffer overflows. Gibts da für C keine Alternative?
mfg
- Dagegen gibt es sicher eine systemabhängige Alternative.
- Kannst du den Buffer großzügig wählen.
- ist printf dafür sowieso ein schlecht Wahl denn printf macht bei "%f" 6 Nachkommastellen. Es sei denn, du gibst an wieviel Nachkommastellen du haben willst.
-
B.B. schrieb:
nicht wenn man sprintf richtig benutzt.
und achja, modf http://www.cplusplus.com/reference/clibrary/cmath/modf/ liefert u.a. den nachkommaanteil.Und wie soll ich festlegen, dass er nicht über mein char-Array schreibt?
Es gibt noch snprintf(), aber das scheint nicht ganz zu funktionieren.
Würde mich auf Hilfe freuen.mfg
-
Jeffson schrieb:
Würde mich auf Hilfe freuen.
mfgWas ist denn genau dein Problem?
Was willst du erreichen?
Warum willst du das mit sprintf (oder dergleichen) lösen?
-
1. Problem:
Ich will die Anzahl der Nachkommastellen einer Gleitkommazahl ermitteln (mit einer Zeichenkette)
2. Problem:
Ich will eine sicherere Variante, eine Zahl in einen String zu schreiben, als mit sprintf() --> Buffer-Overflow-Gefahr.Ich hoffe ihr könnt mir weiterhelfen.
mfg
-
Jeffson schrieb:
Und wie soll ich festlegen, dass er nicht über mein char-Array schreibt?
DirkB schrieb:
- Kannst du den Buffer großzügig wählen.
-
Es gibt doch sicher eine effizientere Lösung als viel mehr Speicher zu verbrauchen als nötig ist?
snprintf() stellt nur dann ein vernünftiges Ergebnis da, wenn ich %f statt %lf hernehme. Wieso?
mfg
-
Jeffson schrieb:
Es gibt doch sicher eine effizientere Lösung als viel mehr Speicher zu verbrauchen als nötig ist?
mfg
Ja, du kannst es berechnen.
Um welchen Wertebereich handelt es sich denn?
-
Jeffson schrieb:
Es gibt doch sicher eine effizientere Lösung als viel mehr Speicher zu verbrauchen als nötig ist?
Die Zeiten, in denen es auf 50 Byte Speicher ankam, sind seit ein paar Wochen vorbei.
-
Es handelt sich um double-Werte. Davon dann die Nachkommastellen. Aber das Problem liegt darin, dass ich vorher anhand einer double-variable nicht wissen kann, wieviel Nachkommastellen es hat. Dazu muss das erst mal in einen String umgewandelt werden. Doch wie fordere ich für den String nur soviel Speicherplatz, wie nötig?
mfg
-
Die Frage ist unpräzise gestellt. Gleitkommazahlen werden intern exponential mit Mantisse und Exponent dargestellt. Somit haben sie keine angebbare Anzahl von Nachkommastellen, sondern nur eine angebbare Anzahl von Stellen (digits) insgesamt. Die Anzahl der möglichen Nachkommastellen hängt somit entscheidend von der Anzahl der Vorkommastellen ab.
-
Jeffson schrieb:
Es handelt sich um double-Werte. Davon dann die Nachkommastellen.
mfgKlar ist das double (int haben keine Nachkommstellen und float ist von gestern)
Die Nachkommstellen von 3.141 sind 141. Die Anzahl der Nachkommastellen ist 3.Die Nachkommstellen von 3.141e-1 sind 3141. Die Anzahl der Nachkommastellen ist 4.
Die Nachkommstellen von 3.141e-100 sind 0000...0003141. Die Anzahl der Nachkommastellen ist 103.
include <stdio.h> #include <math.h> int main() { double e, d; double f = 1.0; int i = 0; d = 1.0/3.0; // d = 3.12345678901234567890e-20 for (i = 0;modf(d*f,&e) > 0;i++,f*=10.0) ; printf("Anzahl Nachkomma von %g : %d\n", d, i); return 0; }
-
Wenn man nur die Nachkommastellen benötigt und die begrenzen will, wo liegt das Problem? Ein Rundung gibt es obendrein.
Beispiel für max. 9 Nachkommastellen:double d=2/3.,i; char s[9+3]; /* für '0','.','\0' */ sprintf(s,"%.9f", modf(d,&i)); puts(s);
-
Wieso funktioniert dies nicht:
char nkstellen[11]; memset(nkstellen, '\0', sizeof(nkstellen)); double vkst = 0; snprintf(nkstellen, sizeof(nkstellen), "%lf", modf(4.5, &vkst)); printf("nkstellen = %s\n", nkstellen);
Ergebnis: "nkstellen = 0.00000..." statt 0.50000 wird ausgegeben
mfg
-
Jeffson schrieb:
B.B. schrieb:
nicht wenn man sprintf richtig benutzt.
und achja, modf http://www.cplusplus.com/reference/clibrary/cmath/modf/ liefert u.a. den nachkommaanteil.Und wie soll ich festlegen, dass er nicht über mein char-Array schreibt?
Es gibt noch snprintf(), aber das scheint nicht ganz zu funktionieren.
Würde mich auf Hilfe freuen.mfg
du legst es im formatstring fest. die anzahl der vor- und nachkommastellen,
z.b.sprintf(buf, "%1.1f", r);
wieso sollte snprintf nicht funktionieren? das wäre mir neu.
char buf[4] = {0}; double r = 1.12345; sprintf(buf, "%1.1f", r); snprintf(buf,sizeof(buf)-1, "%f", r);
-
Vielen Dank, das ist das was ich gesucht habe!
Aber mich würds trotzdem interessieren, wieso der Code von mir oben nicht funktioniert hat?
mfg
-
Vermutlich hast Du
#include <math.h>
vergessen.
-
oder vkst mit 0.0 statt 0 initialisieren
-
Wenn es dich weiter interessiert, wie man mit sprintf oder anders eine Gleitkommazahl in Vorkomma- und Nachkommastellen zerlegen oder runden kann, findest du auf meiner hp http://berniebutt.npage.de dazu passende Codes zum Herunterladen. Bedenke, sprintf ist langsam. Doch das macht sich erst bei sehr vielen Aufrufen bemerkbar.
Ansonsten: wenn etwas sicher läuft, nimmt man das und fragt nicht warum etwas anderes nicht funktioniert!