Dlaczego Qt zmienia zachowanie sscanf ()?

Zauważyłem, że Qt (4.8) zmienia zachowaniesscanf(). Bez Qtsscanf() działa jak zwykle, ale z, zajmuje tylko zlokalizowane ciągi.

Oto zminimalizowany przykład:

Bez Qt (zwykły 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;
}

Wydajność:

0.83    -->     A5_c

(podany ciąg to 5xchar-array, wynik poprawny)

Z 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;
}

Wydajność:

0       -->     A5_c

(Nadany ciąg nadal jest 5xchar-barray, ale wynik jest nieprawidłowy)

Podczas0.83 zawiedzie, używając0,83 (mój format locale) działa poprawnie z Qt - ale nie działa bez Qt (domyślne zachowanie). Jak pokazano przeztypeid(), nie maQString używane - tylko zwykłe stare tablice znaków C (++). Tak, dzieje się tak samostd::string.

Oprócz tego, używając astd::stringstream działa normalnie:

std::stringstream ss;
ss << "0.83"; // But the value into the stream
ss >> f;      // Get a float out of it

Wynik:

0.83

I tu pojawia się pytanie: Dlaczego łańcuchy znaków isscanf() połączenia dotknięte przez Qt? Rozumiem dlaczegoQStringsą zlokalizowane, ale pękająsscanf() (i potencjalnie innestdio.h funkcje) brzmi dla mnie źle.

Tło: Połączyłem bibliotekę (nie Qt) zawierającąsscanf() gdzieś głęboko w kodzie, do projektu Qt. Wynik: jakiś kod nie powiódł się w tym projekcie, podczas gdy działał wszędzie… (znalezienie przyczyny zajęło trochę czasu…)

questionAnswers(3)

yourAnswerToTheQuestion