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)
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 dlaczegoQString
są 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…)