snprintf: простой способ заставить. как основа? - PullRequest
1 голос
/ 11 августа 2010

Моя программа не работала правильно на одной машине, поэтому я начал искать ошибку и обнаружил, что на этой машине snprintf использует запятую (,), а не a.(точка) как 99% других компьютеров (по крайней мере, по моему опыту).

Разве это не должно быть стандартизировано?

Я использую библиотеку, которая предполагает, что основа является.(точка) и поэтому он не работает должным образом с запятой.

Итак, мой вопрос, есть ли простой способ заставить точку в качестве символа радиуса?Я знаю, что мог бы просто искать и заменять запятую точкой вручную, но наверняка есть более чистый способ.

Ответы [ 3 ]

6 голосов
/ 11 августа 2010

Вы сможете изменить настройку локали, используя функцию setlocale, чтобы snprintf использовал точку.Попробуйте установить его на «POSIX» или «C».(setlocale(LC_ALL, "POSIX")

5 голосов
/ 11 августа 2010

. против , устанавливается частью LC_NUMERIC локали.Поэтому убедитесь, что вы настроили свою программу на использование локали, которая использует . (например, "POSIX").

1 голос
/ 11 августа 2010

Для библиотечного кода вы можете использовать функцию POSIX 2008 uselocale вместо setlocale. Он может установить специфичный для потока языковой стандарт, так что если код вашей библиотеки вызывается из программы, использующей потоки, он не испортит поведение других потоков (и / или не приведет к аварийному завершению программы, поскольку setlocale не потокобезопасен).

Для кода приложения вы должны просто избегать установки категории языка LC_NUMERIC на что-либо кроме C / POSIX. Единственные категории, которые вам действительно нужно установить для большинства приложений, это LC_CTYPE, LC_MESSAGES и, возможно, LC_COLLATE.

...