2016-10-19 4 views
0

Ich habe zwei Probleme. Beide können durch diesen einfachen Code dargestellt werden (kompilierte mit g ++ -Wall -O2 -std = C++ 14):fprintf hat Probleme mit Zeichen von einer Funktion zurückgegeben

#include <string> 
using namespace std; 

const char *printi(const unsigned long &i) { 
    return to_string(i)).c_str(); 
} 

int main() {  
    unsigned long i1 = 1; unsigned long i2 = 2; 
    fprintf(stderr, "%s%s\n", printi(i1), printi(i2)); 
} 

Problem nicht. 1 - Es wird "11" gedruckt, während "12" gedruckt werden soll.

Problem-Nr. 2 - Manchmal druckt es überhaupt keine Zahlen, sondern seltsame Zeichen.

+0

Interessanter wenn ich laufe diesen Code bekomme ich 22 als meine Ausgabe. Warum druckst du auf "stderr" statt "stdout"? –

+0

Sie geben eine temporäre = schlechte Nachricht zurück. – AndyG

+0

Wie kann ich arbeiten, wenn ich die von meiner Funktion zurückgegebenen Werte nicht verwenden kann? :(Ich muss diese Zeichenfolge in fprintf setzen ... (der gesamte Code ist nur eine Abstraktion von etwas viel größer, und das ist eine Debug-Informationen, deshalb ist es stderr) – Jecke

Antwort

4

Beachten Sie, dass std::to_string() eine std::string zurückgibt. Diese std::string existiert nur innerhalb des Funktionsbereichs printi(), was bedeutet, wenn Sie die Funktion verlassen (wenn Sie return), der Destruktor dieser std::string aufgerufen wird, und die Adresse, die Sie zurückgeben (der Wert von c_str()) zeigt nicht mehr auf gültigen Speicher . Ihr Code hat ein nicht definiertes Verhalten, weil Sie nicht wissen, auf welche Daten er gerade zeigt.

Um dies zu beheben, können Sie printi() zurückkehren stattdessen eine std::string haben, die tief in die Anrufer auf return kopiert werden, und dann kann der Anrufer c_str() nach Bedarf verwenden:

#include <string> 
using namespace std; 

string printi(const unsigned long &i) { 
    return to_string(i); 
} 

int main() {  
    unsigned long i1 = 1; unsigned long i2 = 2; 
    fprintf(stderr, "%s%s\n", printi(i1).c_str(), printi(i2).c_str()); 
} 
+0

Wahr. Fest. Vielen Dank. – Sawel

+0

Hmm ... also wenn ich eine Funktion int return5() {short a = 5; zurückgeben a; }, Kann ich nicht erwarten, dass cout << 2 * return5(); wird 10 drucken? Oder funktioniert das nur mit Strings? – Jecke

+0

* "Um es zu beheben, können Sie einen Verweis auf std :: string" * - Es klingt wie Sie vorschlagen, ersetzen Sie einen baumelnden Zeiger mit einem baumelnden Verweis. Wenn nicht, bin ich mir nicht sicher, was Sie hier vorschlagen. –

Verwandte Themen