_sntprintf alternative in VS
-
Hallo Leute,
ich nutze _sntprintf um in einem String ein hex Byte zu ändern.
_sntprintf(pString, 2, _T("%02x"), ..);
Der string ist aber länger als die 2 Byte. Ich gebe aber 2 als Länge an um zu verhindern das er den String terminiert.
Jetzt meckert der ja das _snprintf unsafe ist und man _snprintf_s benutzen soll. Diese funktion verhält isch aber nun anders:
Wenn len = count, len-Zeichen in buffer gespeichert werden, wird kein NULL-Terminator angefügt, und len wird zurückgegeben.
Die _snprintf_s gibt mir jetzt eine exeption.
Gibt es eine alternative funktion die das selbe macht wie _snprintf bei Len = count?
MfG
-
Destiniy schrieb:
Die _snprintf_s gibt mir jetzt eine exeption.
Hast du beachtet, dass die _s-Funktionen andere Argumente haben als die normalen Varianten? Oder hast du einfach nur "_s" an deinen Aufruf gehängt?
Ansonsten würde ich ich mich allgemein an dieser Warnung nicht zu sehr stören. Die "_s"-Funktionen schützen den Programmierer vor seiner eigenen Dummheit. Du bist doch sicherlich ein sicherheitsbewusster Programmierer, der nicht einfach irgendwo ein "_s" an seine Funktionsaufrufe anhängt, ohne zu gucken, was das überhaupt bedeutet, oder?
Dem Rest deiner Frage ist schwer zu folgen: Wer macht wann was? Woher weißt du das? Was sind überhaupt len und count? Wovon redest du?
-
Hallo,
genau deswegen meine Frage. Ich würde gerne die Warnung weg haben aber die _s Funktion verhält sich anders bei len = count. Aber der Fall ist genau der den ich benötige. Steht auch so in der msdn.
len ist die übergebene Länge und Count ist die Stringlänge von "%02X" und wenn die gleich waren hat die Funktion keine Abschließende 0 dahinter gemacht. Die _s Funktion hat ja noch den Parameter Size und wenn size und len 2 sind meldet der jetzt per exeption Puffer zu klein da die 0 nicht mehr reinpasst, die ich eigentlich auch nicht haben will.
Deshalb meine Frage ob es eine Andere Funktion gibt die in einem 20 Zeichen String (char
an Position 5-7 die drei Zeichen ändern kann.
_sntprintf(pString, 2, _T("%02x"), ..);
Mir ist beim googleln jetzt keine ins auge gefallen und deshalb die FRage.
Kennst du da eine?MfG
-
Wieviel Platz hast du denn in pString?
Genau 2 Zeichen? Dann ist die 2 im Formatspecifier falsch.
Mehr als 2? Dann kannst du die wahre Länge angeben, zumindest aber 3.
Weniger als 2? Dann ist alles falsch._sntprintf(pString, 2+1, _T("%02x"), ..);
-
Destiniy schrieb:
len ist die übergebene Länge und Count ist die Stringlänge von "%02X" und wenn die gleich waren hat die Funktion keine Abschließende 0 dahinter gemacht.
Das sollte eigentlich nicht so sein. Die snprintf-Varianten sollten maximal die angegebene Zeichenzahl - 1 schreiben, dann eine Nullterminierung anhängen und dann zurück geben, wie lang die Zeichenkette denn eigentlich gewesen wäre.
-
in der msdn steht das aber so in der Dokumentation
[url]
https://msdn.microsoft.com/de-de/library/2ts7cx93.aspx
[/url]Wenn len = count, len-Zeichen in buffer gespeichert werden, wird kein NULL-Terminator angefügt, und len wird zurückgegeben.
und so macht es die Funktion auch.
Nur die neue Funktion geht korrekt vor also _sntprintf_s. Das ist aber nicht mein gewünschtes ergebnis.
Deshalb meine frage gibt es irgend eine ander xxxprintfxxx Funktion die keine abschließende 0 macht um einen Substring in einen größeren String zu kopieren (ersezten)
MfG
-
Nein.
Nimm memmove.