J_o_k_e_R
@J_o_k_e_R

Почему sscanf использует запятую вместо точки при использовании русской локали в linux?

Есть у нас разработчик, который программирует в Visual Studio, используя C++ с QT. Его программы должны работать как под Windows, так и под Linux. К сожалению от Linux он далек.


Есть я, тот кто собирает этому человеку его программы под Linux. Я неплохо разбираюсь в нем, но далек от программирования.


И есть у нас следующая проблема:

Есть исходные данные вида

line=«EXPTIME = 0.5212 / actual integration time (sec) „

приходящие извне.


Под windows код

sscanf(line, “%*10c %le», &expTime)

выцепляет дробное число нормально.

Под Linux с любой включенной русской локалью (ru_RU.UTF-8, ru_RU.KOI8-R) за дробный разделитель считается запятая и поэтому в нашем случае считывается только целая часть.


Если ставлю LANG=C, то все работает нормально.


Как нам быть и что делать? Хотелось бы без костылей. Так как, выставляя LANG=C перед запуском его программы, мы ломаем вывод кириллицы.


P.S. Давайте постараемся обойтись без холиваров, пожалуйста, мне итак уже все уши прожжужали какой неправильный этот linux и как в нем все не так как в VS работает.
  • Вопрос задан
  • 4544 просмотра
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 1
@rPman
Очень осторожно пишите программы, работа которых может зависеть от установленной локали, встречал людей, которые меняют параметры локали в windows очень причудливым образом.
Везде, где возможна подобная неоднозначность принудительно прописывать параметры локали (как в windows так и в linux).

В данном конкретном случае лучше постараться избежать сохранение и использование текстового представления таких неоднозначных вещей как вещественные числа и даты… первый же запрос в гугл на вашу задачу — сериализация вещественного числа в целочисленном представлении: stackoverflow.com/questions/4733147/portability-of-binary-serialization-of-double-float-type-in-c
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы