Warum ändert Qt das Verhalten von sscanf ()?
Ich habe bemerkt, Qt (4.8) ändert das Verhalten vonsscanf()
. Ohne Qtsscanf()
funktioniert wie gewohnt, benötigt aber nur lokalisierte Zeichenfolgen.
Hier ist ein minimiertes Beispiel:
Ohne Qt (normales C ++)int main(int argc, char *argv[])
{
float f;
sscanf("0.83", "%f", &f);
std::cout << f << "\t-->\t" << typeid("0.83").name() << std::endl;
return 0;
}
Ausgabe:
0.83 --> A5_c
(Die angegebene Zeichenfolge ist eine 5xchar
-Array, Ergebnis korrekt)
int main(int argc, char *argv[])
{
/*
* This breaks sscanf() for the whole (!) project
* and linked libraries too!
*/
QApplication(argc, argv);
float f;
sscanf("0.83", "%f", &f);
std::cout << f << "\t-->\t" << typeid("0.83").name() << std::endl;
return 0;
}
Ausgabe:
0 --> A5_c
(Bei gegebener Saite noch ein 5xchar
-Array, aber Ergebnis ist falsch)
Während0.83
schlägt fehl, mit0,83
(mein Gebietsschema-Format) funktioniert einwandfrei mit Qt - schlägt jedoch ohne Qt fehl (Standardverhalten). Wie gezeigt vontypeid()
, da ist keinQString
used - nur einfache alte C (++) char-Arrays. Übrigens passiert das auchstd::string
.
Daneben mit einemstd::stringstream
arbeitet weiter wie bisher:
std::stringstream ss;
ss << "0.83"; // But the value into the stream
ss >> f; // Get a float out of it
Ergebnis:
0.83
Und hier kommt die Frage: Warum sind Char-Array-Strings undsscanf()
Anrufe von Qt betroffen? ich verstehe warumQString
sind lokalisiert, brechen abersscanf()
(und möglicherweise anderestdio.h
Funktionen) klingt für mich böse.
Hintergrund: Ich habe eine (Nicht-Qt) Bibliothek verlinkt, die a enthältsscanf()
irgendwo tief im Code, zu einem Qt-Projekt. Ergebnis: Ein Teil des Codes ist in diesem Projekt fehlgeschlagen, während er an allen anderen Stellen funktioniert hat… (es hat einige Zeit gedauert, um die Ursache zu finden…)