_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


  • Mod

    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"), ..);
    

  • Mod

    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.


Anmelden zum Antworten