¿Por qué Qt cambia el comportamiento de sscanf ()?
Me he dado cuenta, Qt (4.8) cambia el comportamiento desscanf()
. Sin qtsscanf()
Funciona como siempre, pero con, solo toma cadenas localizadas.
Aquí hay un ejemplo minimizado:
Sin Qt (plano 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;
}
Salida:
0.83 --> A5_c
(La cadena dada es un 5xchar
-array, resultado correcto
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;
}
Salida:
0 --> A5_c
(La cuerda dada sigue siendo un 5xchar
-registrar, pero el resultado es incorrecto)
Mientras0.83
falla, usando0,83
(mi formato local) funciona bien con Qt, pero falla sin Qt (comportamiento predeterminado). Como se muestratypeid()
, no hayQString
usado - solo arrays de caracteres C (++) antiguos. Por cierto, lo mismo le sucede astd::string
.
Además de esto, usando unastd::stringstream
sigue trabajando como siempre:
std::stringstream ss;
ss << "0.83"; // But the value into the stream
ss >> f; // Get a float out of it
Resultado:
0.83
Y aquí viene la pregunta: ¿Por qué son las cadenas char-array ysscanf()
Llamadas afectadas por Qt? entiendo porqueQString
Están localizados, pero rompiendosscanf()
(y potencialmente otrosstdio.h
funciones) me suena malvado.
Fondo: He vinculado una biblioteca (no Qt), que contiene unasscanf()
En algún lugar profundo del código, a un proyecto Qt. Resultado: Algo de código falló en este proyecto, mientras que funcionó en cualquier otro lugar ... (tomó algún tiempo para encontrar la causa ...)