Почему Qt меняет поведение sscanf ()?
Я заметил, что Qt (4.8) меняет поведениеsscanf()
, Без Qtsscanf()
работает как обычно, но с, он принимает только локализованные строки.
Вот минимизированный пример:
Без Qt (простой 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;
}
Выход:
0.83 --> A5_c
(данная строка 5xchar
Массив, результат правильный)
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;
}
Выход:
0 --> A5_c
(Заданная строка все еще 5xchar
- массив, но результат неверный)
Пока0.83
не удается, используя0,83
(мой формат локали) отлично работает с Qt - но не работает без Qt (поведение по умолчанию). Как показаноtypeid()
, нет никакихQString
Используется - только старые символы C (++). Кстати, то же самое происходит сstd::string
.
Кроме того, используяstd::stringstream
продолжает работать как обычно:
std::stringstream ss;
ss << "0.83"; // But the value into the stream
ss >> f; // Get a float out of it
Результат:
0.83
И тут возникает вопрос: Почему строки массива char иsscanf()
звонки, затронутые Qt? Я понимаю почемуQString
локализованы, но ломаютсяsscanf()
(и, возможно, другиеstdio.h
функции) звучит зло для меня.
Фон: Я связал (не Qt) библиотеку, содержащуюsscanf()
где-то глубоко в коде, к проекту Qt. Результат: в этом проекте произошел сбой некоторого кода, хотя он работал везде… (потребовалось некоторое время, чтобы найти причину…)