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)

Mit Qt
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 warumQStringsind 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…)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage