2016-06-17 23 views
1

Das Problem ist wahrscheinlich etwas einfaches, aber ich konnte es nicht nach Stunden der Forschung und Bearbeitung zu arbeiten, also hier posten ich mein Problem.sprintf_s() scheitert mit "Debug-Assertion fehlgeschlagen" Fehler

Ich versuche, eine Funktion zu machen, die entweder eine ganzzahlige Ganzzahl oder eine zweistellige Ganzzahl erhält und sie als eine Zeichenfolge nach dem Konvertieren in ein zwei Ganzzahlformat (z. B. 7 bis 07) zurückgibt.

char *to_two_digits(int num) { 

    char num_str[4]; 

    sprintf(num_str, "%d", num); 

    int length = sizeof(*num_str)/sizeof(char); 

    static char *return_string; 

    if (length == 1) { 

     sprintf_s(return_string, "0%d", num); 

     return return_string; 
    } 
    else if (length == 2) { 
     *return_string = *num_str; 
     return return_string; 
    } 
    else { 
     printf("Error! Number cannot be represented as a two-digit."); 
     exit(1); 
    } 
} 

Die Funktion schlägt fehl, wenn die sprintf_s() Funktion mit einem Fehler ausgeführt wird, das sagt:

------------------- -------- Microsoft Visual C++ - Laufzeitbibliothek -----------

Debug-Assertion fehlgeschlagen!

Datei: minkernel \ CRTs \ ucrt \ src \ appcrt \ stdio \ output.cpp

Line: 261

Expression: format = nullptr

Was das Problem ist, und wie kann ich es reparieren? Vielen Dank im Voraus.

+0

Wo ist dein [MCVE], und wie können wir es sehen? Vielen Dank im Voraus. –

Antwort

2

Sie übergeben einen Nullzeiger an die sprintf_s-Funktion. Der Zeiger, den Sie in dieser Zeile deklarieren

wurde nie initialisiert, um auf etwas zu zeigen. Da es als statisch deklariert ist, wird es auf Null vorinitialisiert (anstatt nur einen unbestimmten Wert zu haben).

Dies ist, was die Nachricht Ihnen sagt. Es gibt einen assert Code in sprintf_s, der überprüft, dass Sie keinen Nullzeiger übergeben haben, und das ist, was feuern wird.

Sie sollen einen Zeiger auf einen Puffer übergeben, in den die Funktion schreiben kann. Aber da Sie C++ verwenden, sollten Sie eigentlich nur einen std::string verwenden, den Sie dann von der Funktion zurückgeben könnten, ohne eine statische Variable zu benötigen.

+0

Danke für die Antwort, ich werde versuchen, die String-Klasse zu verwenden, anstatt eine statische Variable zu verwenden. Kann ich aber auch wissen, welche Bearbeitung ich vornehmen soll, um den Code mit einer statischen Variable funktional zu machen? –

+0

@jake Sie müssten den Zeiger tatsächlich auf etwas zeigen. Wie ein Zeichenpuffer der entsprechenden Größe.Zum Beispiel: 'static char return_string [100];' –

+0

'static char return_string [100];' ist einer der Codes, die ich vorher ausprobiert habe, und erzeugt den gleichen Fehler. Irgendeine Idee warum? –

0

Es ist genau das, was es sagt — Sie übergeben einen Nullzeiger an sprintf_s.

Es ist das return_string, das Sie nicht initialisiert haben, um auf irgendetwas zu zeigen, geschweige denn einen Puffer von ausreichender Größe für das tatsächliche Ergebnis. Anstatt einen unbestimmten Wert zu haben, ist es sicherlich ein Nullzeiger, da er static ist, aber diese Versicherung hilft Ihnen nicht.

Es ist eigentlich keine gute Idee, static für Speicherverwaltung wie folgt zu verwenden, da Ihre Funktion 100% nicht einspringt. In der Regel sollten Ihre Benutzer einen Puffer mit ausreichender Größe für das Ergebnis übergeben und den aufrufenden Bereich die Lebensdauer des Puffers verarbeiten lassen.

Verwandte Themen