Por que o Qt altera o comportamento do sscanf ()?
Eu notei, o Qt (4.8) muda o comportamento dosscanf()
. Sem Qtsscanf()
funciona como de costume, mas com, leva apenas seqüências localizadas.
Aqui está um exemplo minimizado:
Sem Qt (simples 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;
}
Saída:
0.83 --> A5_c
(dado string é um 5xchar
-array, resultado correto)
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;
}
Saída:
0 --> A5_c
(Dado string ainda um 5xchar
-array, mas o resultado está errado)
Enquanto0.83
falha, usando0,83
(meu formato local) funciona bem com Qt - mas falha sem Qt (comportamento padrão). Como mostrado portypeid()
, não háQString
Usado - somente arrays char C (++) simples. Btw., Mesmo acontece comstd::string
.
Além disso, usando umstd::stringstream
continua funcionando normalmente:
std::stringstream ss;
ss << "0.83"; // But the value into the stream
ss >> f; // Get a float out of it
Resultado:
0.83
E aí vem a pergunta: Por que as strings de matriz de caracteres esscanf()
chamadas afetadas por Qt? Eu entendo porqueQString
estão localizados, mas quebrandosscanf()
(e potencialmente outrosstdio.h
funções) soa mal para mim.
Fundo: Eu vinculei uma biblioteca (não-Qt), contendo umsscanf()
em algum lugar no fundo do código, para um projeto Qt. Resultado: algum código falhou neste projeto, enquanto funcionou em qualquer outro lugar… (demorou um pouco para encontrar a causa…)