Kurze Erklärung:
C-Funktionen funktioniert nicht mit "
std::string".
Leg einen Buffer an oder besser, nutze die C++-Funktionen außer in ganz speziellen Fällen, wenn du genau weißt, was du machst.
Lange Erklärung:
Die C-Funktionen nutzen ein sehr wildes und beschränktes Sprachfeature um Funktionen mit einer beliebigen Anzahl Parameter zu realisieren:
Die einfache Übergabe der Daten als "Byterepräsentation" auf den Stack. Dabei können keine Typinformationen mit an den Aufgerufenen("
std::scanf" oder "
std::printf") übergeben werden. Diese werden zb. aus den Parametern rekonstruiert. "%s" steht für einen C-String(Das heißt konkret, ein einfacher Zeiger auf einen Char-Buffer), du übergibst jedoch einen Zeiger auf einen C++ String an die Funktion, welcher fundamental anders aufgebaut ist. Die Funktion denkt, es wäre ein C-String, was natürlich nicht funktioniert, weil es keiner ist. Aber das weiß die Funktion eben leider nicht, wie oben erklärt. Das liegt an den verrückten Eigenheiten dieses uralten C-Features, wovon ebenfalls eine Folge ist, dass nichtmal der Compiler ein Warnung ausgelösen kann. Ein paar ganz besonders intelligente Compiler, können in einige Fällen davor warnen. Wenn man die Funktionen also trotzdem nutzen will, ist es eine einfache Möglichkeit sicheheitshalber "
-Wformat=2" anzuwenden, dann
sollte der GCC in einigen Fällen davor warnen. Dadurch und das man für "
std::scanf" einen Buffer selbst anlegen muss und selbst verwalten, kann man von der Funktion eigentlich nur abraten. "
std::printf" ist nicht ganz so kompliziert richtig zu verwenden wie "
std::scanf". Das an der "
std::printf" wäre für sich genommen zumindest einfach zu lösen, weil man aus dem C++ String mit der "
c_str()"-Funktion einen konstanten C-String bekommen kann.