snprintf: moyen simple de forcer. comme radix?

Mon programme ne se comportait pas correctement sur une machine, j’ai donc commencé à chercher le bogue et j’ai découvert que sur cette machine, snprintf utilise une virgule (,), pas un. (point) comme 99% des autres ordinateurs (du moins dans mon expérience).

Cela ne devrait-il pas être normalisé?

J’utilise une bibliothèque qui suppose que la base est un. (point) et donc cela ne fonctionne pas correctement avec une virgule.

Ma question est donc la suivante: existe-t-il un moyen simple de forcer le point en tant que caractère de base? Je sais que je pourrais simplement rechercher et remplacer la virgule par un point manuellement, mais il existe sûrement un moyen plus propre.

    Vous devriez pouvoir modifier vos parameters régionaux à l’aide de la fonction setlocale pour que snprintf utilise un point. Essayez de le régler sur “POSIX” ou “C”. ( setlocale(LC_ALL, "POSIX")

    . versus , est défini par la partie LC_NUMERIC de la locale. Assurez-vous donc que votre programme utilise des parameters régionaux utilisant le fichier . (comme "POSIX" ).

    Pour le code de bibliothèque, vous souhaiterez peut-être utiliser la fonction POSIX 2008 uselocale au lieu de setlocale . Il est capable de définir des parameters régionaux spécifiques aux threads. Ainsi, si votre code de bibliothèque est appelé à partir d’un programme utilisant des threads, il ne gâchera pas le comportement des autres threads (et / ou provoquera le blocage du programme, car setlocale n’est pas un thread. -sûr).

    Pour le code d’application, vous devez simplement éviter de définir la catégorie de parameters régionaux LC_NUMERIC sur autre chose que C / POSIX. Les seules catégories que vous devez réellement définir pour la plupart des applications sont LC_CTYPE , LC_MESSAGES et éventuellement LC_COLLATE .